我正在用這個簽名創建一個方法
public async Task RunThisFunction(Func<Task> func)
現在此方法的用戶可以將它與這樣的函式一起用作引數
public async Task GetThingsDone(){await DoSomething();}
這并不奇怪,但您似乎也可以發送這樣的功能
public async Task<string> GetString(){await return GetSomething();}
為什么會這樣,我將如何撰寫簽名以防止后者被發送到 RunThisFunction?
uj5u.com熱心網友回復:
您可以推斷任務的通用引數:
public async Task<TTaskArg> RunThisFunction<TTaskArg>(Func<Task<TTaskArg>> func)
{
return await func();
}
您可以將其作為現有方法的多載,編譯器將根據推斷的型別選擇正確的方法。
在線嘗試
注意:雖然我在可運行示例中沒有使用async
關鍵字,但那是因為我的代碼本質上是同步的。在實踐中,您可能希望使用上面的async
andawait
關鍵字。
如果您希望顯示編譯器警告,您可以添加該[Obsolete]
屬性,例如:
[Obsolete("Please do not use tasks with a generic parameter.")]
public async Task<TTaskArg> RunThisFunction<TTaskArg>(Func<Task<TTaskArg>> func)
{
return await func();
}
也許(如果你需要的話)InvalidOperationException
如果你想阻止它(成功)在運行時使用,你可以從方法中拋出一個。
正如 Alexei 所說,您還可以為過時的警告 (CS0612) 啟用“作為錯誤的警告”。有關如何執行此操作的說明,請參見此處。請記住,您需要使用 CS0612 而不是 NU1605。
uj5u.com熱心網友回復:
該類Task<T>
繼承了Task
該類,因此回傳一個Task<string>
IS 的方法回傳一個Task
. 您通常不能在需要更具體型別的地方提供不太具體的型別,因為它沒有更具體的型別所具有的其他成員。通常,您可以提供一個更具體的型別,其中需要一個不太具體的型別,因為它將具有不太具體的型別所具有的所有成員。如果您有訪問Task
類成員的代碼并且您傳入 aTask<string>
那么代碼將起作用,因為該Task<string>
物件具有所有這些成員。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/470424.html
上一篇:Nestjs創建通用CRUD服務
下一篇:在泛型宣告中解構有什么用?