2013-08-08 36 views
6

Tôi có một lớp được gọi là BaseRobot:Không thể sửa đổi giá trị trả về bởi vì nó không phải là một biến

var robot2 = new BaseRobot(0, 0, 0); 
    private Point mHome; 
    public Point Home 
    { 
     get { return mHome; } 
    } 

Đó là nơi mà các nhà ban đầu được tạo ra, tôi muốn tạo một ngôi nhà mới trong program.cs. Tôi có mã sau đây nhưng nó không hoạt động, nó xuất hiện với một lỗi nói rằng

Không thể sửa đổi giá trị trả về vì nó không phải là một biến.

Code:

 robot2.Home.X = 1 
    robot2.Home.Y = 5; 

      { 

       Console.WriteLine("===New robot at specified home position==="); 
       StringBuilder ab = new StringBuilder(); 
       ab.AppendFormat("Robot#2 has home at <{0},{0}>.\r\n ", robot2.Home.X, robot2.Home.Y); 
       ab.AppendFormat("It is facing {0} ", robot2.Orientation); 
       ab.AppendFormat("and is currently at <{0},{0}>.\r\n", robot2.Position.X, robot2.Position.Y); 
       Console.WriteLine(ab.ToString()); 
      } 

Làm thế nào để bạn gán giá trị mới cho x và Y?

+5

@MitchWheat và những người khác. Đó không phải là một bản sao, bạn nên thử thực sự đọc cả hai câu hỏi – musefan

+0

Khai báo và không gian tên của 'Điểm 'của bạn là gì? –

Trả lời

2

Bạn cần phải thêm một accessor set đến tài sản Home:

private Point mHome; 
    public Point Home 
    { 
     get { return mHome; } 
     set { mHome = value; } 
    } 
+5

Điều này một mình sẽ không giải quyết được vấn đề – musefan

19

Bạn cần phải đặt Home sở hữu trực tiếp, thường là tốt nhất để tạo ra một đối tượng mới Point ...

robot2.Home = new System.Drawing.Point(1, 5);//x, y 

Ngoài ra, để cho phép bạn cần phải áp dụng một người truy cập set vào tài sản Home của bạn ...

public Point Home 
{ 
    get { return mHome; } 
    set { mHome = value; } 
} 

Nếu bạn muốn tìm hiểu một số thông tin về việc tại sao các trình biên dịch sẽ không cho phép bạn assignthe giá trị trực tiếp đến X tài sản, sau đó kiểm tra một vài trong số các answers over here

+0

Tôi đã làm điều này nhưng bây giờ nhận được một tin nhắn trong chương trình chính nói 'Điểm' không thể được tìm thấy – user2657462

+0

@ user2657462: Sau đó, bạn có thể không có không gian tên chính xác bao gồm. Hãy thêm nó một cách cụ thể khi tạo mới 'Điểm' (xem phần chỉnh sửa của tôi). Hoặc bao gồm nó ở trên cùng của tập tin lớp học của bạn: 'bao gồm System.Drawing;' (hoặc sử dụng "Giải quyết" trong VS) – musefan

+1

Vâng điều này là rất rõ ràng khi bạn nhìn thấy nó một lần nữa cho lần thứ mười. Dù sao +1. Có một huy hiệu Câu trả lời hay khác. – ouflak

2

System.Drawing.Point là một loại giá trị, nghĩa là tài sản Home của bạn đang trả lại bản sao của riêng tư mHome, thay vì tham chiếu đến nó.

Bạn sẽ phải thêm một setter cho các tài sản chủ và điều chỉnh mã của bạn để:

private Point mHome; 
    public Point Home 
    { 
     get { return mHome; } 
     set {mHome = value;} 
    } 

Các điều chỉnh mã gọi của bạn để gán một điểm mới để chủ:

robot2.Home = new Point(1, 5); 
5

Bạn phải thay đổi mã của bạn như sau:

private Point mHome; 

public Point Home 
{ 
    get { return mHome; } 
    set { mHome = value; } 
} 

và đặt như sau:

robot2.Home = new Point(1, 5); 

Đường dẫn là không thay đổi để thay đổi giá trị trong thực tế trả về ví dụ Point mới nhưng thuộc tính của bạn không có setter.

+1

+1 để đề cập rằng cấu trúc không thay đổi. Không được đề cập trong bài bình chọn hàng đầu, điều quan trọng là phải biết tại sao mã trong bài mở đầu không hoạt động – Tseng

+2

Các cấu trúc không phải là bất biến, chúng có ngữ nghĩa giá trị. Bạn có thể sửa đổi một biến cục bộ hoặc một trường kiểu cấu trúc trừ khi nó được thiết kế đặc biệt để không thay đổi được. –

0

Dự đoán của nó, nhưng thuộc tính X và Y có thể chỉ là getters, như thuộc tính Your Home.

Có chức năng nào trong lớp robot của bạn để di chuyển vị trí không ?? Dùng nó.nếu không cung cấp ví dụ đầy đủ xin vui lòng

+0

Đừng quên rằng nếu bạn nhận ra sau khi đăng câu trả lời khác (đã tốt hơn hoặc giống nhau) đã được đăng, bạn không mất phí khi xóa bài đăng của mình để tránh làm lộn xộn câu hỏi với câu trả lời không thêm bất cứ điều gì. – Michelle

1

Bên cạnh các giải pháp đã được đề cập để thực hiện một setter tài sản công cộng, bạn cũng có thể:

Tạo phương thức setter public void SetHomeX(double x) { mHome.X = x; } public void SetHomeY(double y) { mHome.Y = y; }

Expose sân khi nào public Point Home; Lưu ý: để lộ một đơn được công khai thường được coi là không phải là giải pháp tốt. Nhưng có thể có ích trong một số trường hợp.

1

Tôi đã gặp một nơi nào đó giải thích tốt này (tôi sẽ điều chỉnh nó cho trường hợp hiện tại):

Đó là một phần xấu của thiết kế C#.

Bên trong, những thứ như robot2.Home được thực hiện như tài sản, vì vậy khi bạn cố gắng gán một giá trị cho Home.X, một get-hàm cho Home được gọi dưới mui xe (và đây là nơi "Không thể sửa đổi giá trị trả về .. "đi từ). Khi điều này được thực hiện, bạn không thể gán cho một thành viên riêng lẻ (X) của cấu trúc Point, nhưng phải gán toàn bộ cấu trúc.

Vì vậy, trong C#, bạn cần phải đọc các giá trị trên vào một Point và sau đó sửa đổi nó:

robot2.Home = robot2.Home + new Point (deltaX, deltaY); 

Hoặc (nếu chúng ta không quan tâm đến giá trị trước đó (như trong trường hợp này)) chỉ gán nó mới:

robot2.Home = new Point (1f, 5f); 

PS: Tất nhiên, bạn cũng cần phải thêm một setter cho các tài sản chủ (vì nó được đề cập trong câu trả lời khác).

Các vấn đề liên quan