2011-06-21 47 views
5

Tôi gặp phải những gì tôi tin là một lỗi và tôi đã tự hỏi nếu điều này đã được biết đến như là một vấn đề hoặc nếu đây không phải là một vấn đề và tại sao.VB.Net tại sao đây không phải là lỗi?

Vấn đề liên quan đến Chỉ đọc thuộc tính trên một loại một khi biên dịch với VB.Net Compiler trong Visual Studio 2008.

sau đây là các định nghĩa lớp và một chương trình # C nhỏ mà sẽ không biên dịch. (Và là chính xác trong không biên dịch IMHO vì tài sản được thiết lập trong các đại biểu là Read-only)

public interface ITest 
{ 
    bool PrivateBool { get; } 
} 

public class TestClass : ITest 
{ 
    bool privateBool = false; 

    public bool PrivateBool 
    { 
     get 
     { 
      return privateBool; 
     } 
    } 

    bool publicBool = false; 

    public bool PublicBool 
    { 
     get { return publicBool; } 
     set { publicBool = value; } 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     TestClass tc = new TestClass(); 
     //Compile Error 
     //tc.PrivateBool = false; 

     //Compile Error 
     //Action act = new Action(delegate() 
     //{ 
     // tc.PrivateBool = false; 
     //}); 

     //Action<TestClass> test = new Action<TestClass>(delegate(TestClass tcc) 
     //{ 
     // tcc.PrivateBool = false;    
     //}); 

     //Compile Time Error 
     //Action<TestClass> test = new Action<TestClass>(tz=> tz.PrivateBool = false); 

     //Compile Time Error 
     //Action test = new Action(tc.PrivateBool = false); 
    } 
} 

Trong VB.Net Tuy nhiên đây là một vấn đề lớn hơn ... chương trình sẽ biên dịch và thực thi không có ngoại lệ. Nhưng tài sản không được thiết lập. Đây là một cơn ác mộng khi bắt gặp trình gỡ rối trong thời gian chạy và chúng tôi cảm thấy rằng trình biên dịch nên đã bắt được rằng chúng tôi đang chỉ định cho thuộc tính sẵn sàng giống như trình biên dịch CSharp thông báo cho bạn khi biên dịch.

Module Module1 

    Sub Main() 

     Dim tc As New TestClass() 
     Dim setP = New Action(Of TestClass)(Function(d As TestClass) _ 
               d.PrivateBool = False _ 
               ) 

     setP.Invoke(tc) 


    End Sub 

End Module 

Bất cứ ai có thể giải thích nếu đây là logic chính xác và tại sao? Tôi giả định rằng một người nào đó sẽ trả lời rằng công việc của trình biên dịch đã được thực hiện bằng cách kiểm tra kiểu tham số cho đại biểu và đại biểu được nhập để chấp nhận tham số đó giống như khi phân tích cú pháp một Phương thức hoặc một Cơ quan Hàm.

Việc bác bỏ điều này sẽ là trình biên dịch KHÔNG gửi lỗi khi thuộc tính đó được cố gắng được đặt từ bên trong một phương thức nhưng không được ủy nhiệm. Các đại biểu nên được phân tích cú pháp giống như một Phương thức.

Trình biên dịch C# có đang mở rộng không? Tôi nghĩ là không. Kinh nghiệm của tôi là đây là một lỗi trong trình biên dịch vb.net và nên được sửa bởi một bản vá cho IDE.

Cuối cùng nhưng chắc chắn không kém phần nào xảy ra khi Cuộc gọi diễn ra?

Đại biểu chắc chắn không sử dụng sự phản chiếu để đặt thuộc tính tự động vì vậy tôi giả định CLR thấy trình độ chỉ đọc và một NOOP được thực thi. Đó có thực sự là những gì xảy ra hoặc là hành vi không xác định?

Cảm ơn bạn đã dành thời gian!

Trả lời

5

Trong VB.NET 2008, không có lambdas tuyên bố. Tất cả lambdas đều có chức năng. Chúng trả về một giá trị, không thực hiện một hành động nào.

VB lambda của bạn chỉ cần so sánh d.PrivateBoolFalse và trả về kết quả của so sánh.

Đây không phải là lỗi và theo thiết kế. Do đó, nên tránh gán lambda của VB.NET 2008 cho một Action, điều này rất khó hiểu đối với một người không chuẩn bị.

Tuyên bố lambdas xuất hiện trong VB.NET 2010.

+0

Vì vậy, trình biên dịch phỏng đoán rằng việc đánh giá hoặc so sánh đang diễn ra chứ không phải là bài tập? Nếu hành động có thể không có giá trị trả về bởi vì nó bằng với một Void hoặc Sub thì làm thế nào nó có thể trả về bool? – Jay

+0

@Jay Có, trình biên dịch biết đó là so sánh. Giá trị trả về bị bỏ qua, bởi vì nó là một 'Hành động'. Nó hoàn toàn tốt để gọi một hàm từ một sub và chỉ bỏ qua giá trị trả về, bạn đã thấy nó trong mã không lambda nhiều lần. – GSerg

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