Expression.Convert
thường ném trong InvalidOperationException
khi "Không có toán tử chuyển đổi nào được xác định giữa expression.Type và type."Expression.Convert không ném InvalidOperationException cho các tham số kiểu giá trị bất biến?
Thông số kiểu trả về của Func<>
là biến thể cho các loại tham chiếu.
// This works.
Func<SomeType> a =() => new SomeType();
Func<object> b = a;
Nó isn't covariant for value types.
Phương sai chỉ áp dụng cho các loại tham chiếu; nếu bạn chỉ định một loại giá trị cho một tham số kiểu biến thể, tham số kiểu đó là bất biến cho kiểu kết quả được tạo ra.
// This doesn't work!
Func<int> five =() => 5;
Func<object> fiveCovariant = five;
Tuy nhiên, Expression.Convert
tin rằng nó là tốt.
Func<int> answer =() => 42;
Expression answerExpression = Expression.Constant(answer);
// No InvalidOperationException is thrown at this line.
Expression converted
= Expression.Convert(answerExpression, typeof(Func<object>));
Không InvalidOperationException
bị ném khi gọi Expression.Convert
. Cây biểu thức biên dịch chính xác, nhưng khi tôi gọi đại biểu được tạo, tôi nhận được một mong đợi InvalidCastException
.
- Đây có phải là lỗi không? (I reported it as a bug on Microsoft Connect.)
- Làm thế nào để kiểm tra đúng loại có thể được chuyển đổi sang loại khác không? Some answers dường như đề cập đến việc sử dụng
Convert
. Tôi sẽ rất thích một phương pháp mà không phải sử dụng xử lý ngoại lệ như logic.
Có vẻ như toàn bộ logic phương sai không được hỗ trợ đúng cách. Đơn khiếu nại chính xác về việc không thể chuyển đổi từ Func<SomeType>
thành Func<SomeOtherType>
, nhưng không khiếu nại về việc chuyển đổi từ Func<object>
thành Func<string>
.
Điều thú vị là, một khi SomeType
và SomeOtherType
là trong hệ thống phân cấp cùng lớp (SomeOtherType
kéo dài từ SomeType
), nó không bao giờ ném ngoại lệ. Nếu họ không, nó không.
_ "Cho hai loại đối tượng, bạn có muốn biết" _: Như trong [tài liệu msdn trên Expression.Convert] (http://msdn.microsoft.com/en-us/library/bb292051.aspx): _ "Không có toán tử chuyển đổi nào được định nghĩa giữa expression.Type và type." _ Ngay bây giờ tôi không có cách nào để biết liệu cây biểu thức của tôi có biểu thị mã hợp lệ hay không, cho đến khi chạy nó. Vì mục đích của tôi, tôi cần phải biết liệu có thể chuyển đổi tiềm ẩn hay không. –