2009-11-21 46 views
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將使用操作者從轉換源類型。

回答

5

不,它不是表達式樹錯誤。如果您無法爲表達式樹庫提供足夠的信息來執行您想要的操作,那麼您只需接受其默認值即可。無論如何,這些違約都需要遵循C#的規則;表達樹庫是而不是C#編譯器