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 {
}
}
這裏的編譯器錯誤:
lambda「()=> MethodReturningWrappedString()」是否使用不同的規則呢? – Craig
那麼爲什麼當通過lambda時通用約束'where T:class'被考慮到,但是當方法組被通過時呢? –
但是'Wrapper'是一個結構,所以它不能滿足'Func 其中U:class' –