Với lớp sau đây:cast Implicit của Func <MyType> để MyType
public class MyType
{
public static implicit operator MyType(Func<MyType> wrapper) {
return wrapper();
}
}
Từ diễn viên tiềm ẩn của Func<MyType>
để MyType
, tôi giả định sau đây sẽ có thể:
public MyType MyTypeWrapper() {
return new MyType();
}
public void MyTestMethod() {
MyType m = MyTypeWrapper; // not a call!
}
Tuy nhiên tôi nhận được:
Không thể chuyển đổi nhóm phương thức 'MyTypeWrapper' thành loại không được ủy quyền 'T est.MyType '. Bạn có định gọi phương thức này không?
nào, không may cho tôi, khi tìm kiếm (như tôi mong đợi nửa) dẫn đến tonsofquestions mà câu trả lời là:
Hey, ya dun goofed; quăng
()
vào cuốiWhateverMethod
!
Bây giờ, khi tôi đang gõ những dòng này, tôi đã nhận thấy rằng một rõ ràng diễn viên nào trong thực tế biên dịch:
MyType m = (MyType) MyTypeWrapper;
Tại sao nó mà tôi không thể mặc nhiên bỏ Func<MyType>
để MyType
như Tôi đã mô tả?
Ah, tôi hiểu. Bất kỳ cách nào để giảm thiểu "tính năng" trình biên dịch này? (* Tôi đoán "Không" *) – Dan
@Bracketworks: Không. Các nhóm phương pháp là một loại biểu thức rất khác thường ở chỗ chúng không có một loại và của chính chúng (như 'null' và lambdas). – SLaks
@Bracketworks Nó không thực sự khả thi, ngay cả khi họ muốn, theo câu trả lời của tôi. Trình biên dịch đang tìm kiếm một chuyển đổi từ kiểu này sang loại khác và khi nó chuyển đổi cho một chuyển đổi thực hiện chính xác điều đó, không phải bất kỳ chuyển đổi nào chuyển sang bất kỳ loại nào có chuyển đổi thành loại bạn muốn. Điều đó được ra khỏi bàn tay * thực sự * nhanh chóng cho cả trình biên dịch, và cũng là lập trình viên. Hãy tưởng tượng tôi có một lớp học trung bình với một sự chuyển đổi từ đối tượng với tôi và từ tôi sang đối tượng. Bây giờ bất kỳ nhiệm vụ nào có thể liên quan đến cả hai hoạt động đang chạy, cho phép tôi làm đủ mọi thứ có ý nghĩa. – Servy