2017-07-28 82 views
3

之間的模糊調用爲什麼在下一個代碼示例中,(Func<IInterface>)(Func<Task<IInterface>>)之間的模糊調用錯誤?如何在不更換方法組呼的情況下避免這種錯誤?(函數<IInterface>)和(Func <任務<IInterface>>)

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     Method(GetObject); 
    } 

    public static IInterface GetObject() => null; 

    public static void Method(Func<IInterface> func) => 
     Console.WriteLine("First"); 

    public static void Method(Func<Task<IInterface>> funcAsync) => 
     Console.WriteLine("Second"); 
} 

public interface IInterface { } 
+3

「修理」 它:'方法((Func鍵)GetObject的);'或(實際上會更有效在某些方面,因爲編譯器將委託實例緩存在一個靜態字段中):'方法(()=> GetObject());' –

+2

'GetObject'是這個調用中的一個方法組,一個存在於C#中的神祕生物只有[在代表上跳過重載決議](https://stackoverflow.com/questions/2057146/)。 (具體地說,「重載決議不考慮返回類型」)。 –

+0

現在你已經將你的問題修改爲「無需替換方法組調用」,答案是一個非常簡單的「你不能」的答案。剩下的唯一選擇是重命名一個'Method's('MethodAsync'對它有一個很好的響鈴),所以你不會首先遇到超載。 (我認爲在Roslyn存儲庫中引發C#語言改變是另一種選擇,但我沒有給出那麼多成功的機會。)當您使用方法組時,重載解析無法區分這兩種方法。 –

回答

1

這將解決這個問題,因爲你的方法要求返回IInterface功能

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     Method(() => GetObject()); 
    } 

    public static IInterface GetObject() => null; 

    public static void Method(Func<IInterface> func) => 
     Console.WriteLine("First"); 

    public static void Method(Func<Task<IInterface>> funcAsync) => 
     Console.WriteLine("Second"); 
} 

public interface IInterface { } 
相關問題