【发布时间】:2009-11-22 02:48:35
【问题描述】:
这不是“接近真实”的情况,但它表明 Expressions API 如果在源类型中找到合适的运算符,则不会在目标转换类型中查找运算符。
sealed class Foo
{
public static explicit operator Bar(Foo foo) { return null; }
}
sealed class Bar
{
public static implicit operator Bar(Foo foo) { return null; }
}
class Program
{
public static void Blah(Bar bar) { }
private static void Main()
{
Expression<Func<Foo, Bar>> expr1 = x => x;
// fine, used implicit operator from Bar
var param = Expression.Parameter(typeof(Foo), "x");
var expr2 = Expression.Lambda<Func<Foo, Bar>>(
Expression.Convert(param, typeof(Bar)),
param);
// fine, but used explicit operator from Foo!
}
}
另外,如果模拟两种类型的用户定义运算符之间的歧义,C# 编译器根本不编译转换,但 Expressions API 将使用转换源类型中的运算符。
【问题讨论】:
标签: c# .net expression-trees