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 { }
「修理」 它:'方法((Func鍵)GetObject的);'或(實際上會更有效在某些方面,因爲編譯器將委託實例緩存在一個靜態字段中):'方法(()=> GetObject());' –
'GetObject'是這個調用中的一個方法組,一個存在於C#中的神祕生物只有[在代表上跳過重載決議](https://stackoverflow.com/questions/2057146/)。 (具體地說,「重載決議不考慮返回類型」)。 –
現在你已經將你的問題修改爲「無需替換方法組調用」,答案是一個非常簡單的「你不能」的答案。剩下的唯一選擇是重命名一個'Method's('MethodAsync'對它有一個很好的響鈴),所以你不會首先遇到超載。 (我認爲在Roslyn存儲庫中引發C#語言改變是另一種選擇,但我沒有給出那麼多成功的機會。)當您使用方法組時,重載解析無法區分這兩種方法。 –