2
這不是「接近真實」的情況,但它表明,如果Expressions API在源類型中找到合適的運算符,則它不會在目標類型的轉換中查找運算符。這是一個ExpressionTrees錯誤? #4
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#編譯器不編譯轉換可言,但表達式API將使用操作者從轉換源類型。