2011-10-19 22 views
23

Nếu tôi có một tham số động, trình biên dịch dường như sẽ loại bỏ kiểu trả về và nghĩ rằng nó là động.Tham số động làm cho trình biên dịch nghĩ rằng phương thức trả về là động

Ví dụ:

public MethodResult IsValid(object userLogin) 
{  
    return new MethodResult(); 
} 

Bạn sẽ nghĩ rằng:

var isValidResult = IsValid(someObject()); 

nên đọc như

dynamic -> MethodResult 

Nhưng nó nghĩ rằng nó là:

dynamic -> dynamic 

Việc thêm một tham số động vào chữ ký hoàn toàn có thể dừng trình biên dịch không biết sự trở lại nên là gì dù có được gõ mạnh không?

Trả lời

19

Có, động sẽ ngừng trình biên dịch biết loại trên bất kỳ tham số, thuộc tính hoặc kiểu trả về phương thức nào. Thêm dàn diễn viên rõ ràng như:

(MethodResult)IsValid(someObject)); 

Lý do ở đây là khi bạn bước vào thế giới động trong C#, bạn sẽ đi vào kết buộc muộn. Trình biên dịch không thể xác minh mã này vì nó không thể sử dụng bất kỳ phân tích kiểu tĩnh nào nữa. Vì vậy, nó defers cho đến sau này. Bạn có thể giúp khắc phục điều này bằng cách cung cấp các phôi tĩnh làm hướng dẫn cho trình biên dịch.

+1

Để biết thêm chi tiết, hãy kiểm tra [MSDN - Sử dụng loại động] (http://msdn.microsoft.com/en-us/library/dd264736.aspx) - "Độ phân giải quá tải xảy ra tại thời gian chạy thay vì tại thời gian biên dịch nếu một hoặc nhiều đối số trong một cuộc gọi phương thức có kiểu động, hoặc nếu người nhận cuộc gọi phương thức có kiểu động. " - Vì vậy, kết quả là nó không được biết đến cho đến khi chạy, phương thức nào sẽ được gọi. –

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