【发布时间】:2011-10-31 21:34:13
【问题描述】:
Expression.Convert 一般在“没有在表达式.类型和类型之间定义转换运算符”时抛出InvalidOperationException。
Func<> 的返回类型参数对于引用类型是协变的。
// This works.
Func<SomeType> a = () => new SomeType();
Func<object> b = a;
它isn't covariant for value types。
方差仅适用于引用类型;如果为变体类型参数指定值类型,则该类型参数对于生成的构造类型是不变的。
// This doesn't work!
Func<int> five = () => 5;
Func<object> fiveCovariant = five;
不过,Expression.Convert 认为这是可能的。
Func<int> answer = () => 42;
Expression answerExpression = Expression.Constant( answer );
// No InvalidOperationException is thrown at this line.
Expression converted
= Expression.Convert( answerExpression, typeof( Func<object> ) );
调用Expression.Convert 时不会抛出InvalidOperationException。表达式树编译正确,但是当我调用创建的委托时,我得到了预期的InvalidCastException。
- 这是一个错误吗? (I reported it as a bug on Microsoft Connect.)
- 如何正确检查一种类型是否可以转换为另一种类型? Some answers 似乎是指使用
Convert。我非常喜欢不需要将异常处理作为逻辑使用的方法。
似乎没有正确支持整个方差逻辑。它正确地抱怨无法从Func<SomeType> 转换为Func<SomeOtherType>,但它没有抱怨从Func<object> 转换为Func<string>。
有趣的是,一旦SomeType 和SomeOtherType 在同一个类层次结构中(SomeOtherType 扩展自SomeType),它就永远不会抛出异常。如果不是,那就是。
【问题讨论】:
标签: c# expression-trees covariance contravariance