2014-07-03 29 views
5

在所有其他情況下正確推斷類型時,爲什麼在下面的代碼中標記爲// Compiler Error的行上無法調用正確的重載?爲什麼在lambda中調用方法時,將方法組傳遞給重載方法會引起歧義,在這種情況下不會出現?

public static class Code { 

    private static void Main() { 

     OverloadedMethod<string>(() => new Wrapper<string>()); // OK 
     OverloadedMethod<string>(() => MethodReturningWrappedString()); // OK 
     OverloadedMethod<string>((Func<Wrapper<string>>)MethodReturningWrappedString); // OK 
     OverloadedMethod<string>(MethodReturningWrappedString); // Compiler Error 

    } 

    public static Wrapper<string> MethodReturningWrappedString() { 
     return new Wrapper<string>(); 
    } 

    public static void OverloadedMethod<T>(Func<Wrapper<T>> func) where T : class { 
    } 

    public static void OverloadedMethod<T>(Func<T> func) where T : class { 
    } 

    public struct Wrapper<T> where T : class { 
    } 

} 

這裏的編譯器錯誤:

​​

回答

2

因爲該方法組MethodReturningWrappedString可以轉化爲兩者Func<Wrapper<T>>類型的委託和Func<U>類型的用於TU合適的值的委託。

重載解析規則並未規定第一次轉換嚴格優於第二次轉換,因此轉換不明確並導致編譯器錯誤。

+0

lambda「()=> MethodReturningWrappedString()」是否使用不同的規則呢? – Craig

+0

那麼爲什麼當通過lambda時通用約束'where T:class'被考慮到,但是當方法組被通過時呢? –

+0

但是'Wrapper '是一個結構,所以它不能滿足'Func 其中U:class' –

相關問題