Jac*_*goń 2 c# lambda expression-trees
类似于约翰K的问题,但更具体和接受的答案不符合我的需要.
编译好:
Expression<Func<object, object>> specificExpression = (object o) => new object();
Expression generalExpression = specificExpression;
Run Code Online (Sandbox Code Playgroud)
而这个不是:
Expression generalExpression = (object o) => new object();
Run Code Online (Sandbox Code Playgroud)
报告编译错误:
Cannot convert lambda expression to type 'System.Linq.Expressions.Expression' because it is not a delegate type
Expression<Func<T1,T2>>来源于Expression.
现在我有一个框架,方法接受各种表达式,即类型Expression.被迫Expression<Func<T1,T2>>在每个方法调用中显式地将lambdas强制转换为相应的是令人沮丧的.
在这种情况下,为什么这个基本的OOP行为被打破了?
转换不起作用,因为编译器无法推断您尝试创建的特定表达式类型.如果你这样做怎么办?
Expression generalExpression = (object o) => "foo";
Run Code Online (Sandbox Code Playgroud)
这应该是Expression<Func<object, string>>吗?怎么样Expression<Func<object, object>>还是Expression<Func<object, IComparable>>?这些类型都是表达式树的有效最终类型,编译器不会假装知道您要执行的操作.
您需要强制转换特定类型以通知编译器您要生成哪种类型的表达式:
Expression generalExpression = (Expression<Func<object, object>>)
(object o) => new object();
Run Code Online (Sandbox Code Playgroud)
如果您尝试这样做,您会看到类似的编译器错误:
Delegate generalDelegate = delegate() { };
Run Code Online (Sandbox Code Playgroud)
这是一个Action,或一个ThreadStart,或其他一些无争论的无效回归代表?