4 回答

TA貢獻1802條經驗 獲得超5個贊
這與 lambda 是語句 lambda 還是表達式 lambda 無關(正如您將 lambda 從表達式 lambda 更改為語句 lambda 并且行為沒有改變最簡潔地展示的那樣)。
有多種方法可以使 lambda 匹配多個可能的重載。這是特定于較新版本的,但自 C# 1.0 以來已經應用了其他方法(并且自從引入匿名方法以來,需要存在匿名方法的特定處理和由此產生的重載決議消歧)。
確定調用哪個重載的規則在 C# 規范的第 7.5.3.3 節中有詳細說明。具體來說,當參數是匿名方法時,它總是更喜歡委托(或表達式)有返回值的重載,而不是沒有返回值的重載。無論是語句 lambda 還是表達式 lambda,這都是正確的;它適用于任何形式的匿名函數。
因此,您要么需要通過使匿名方法對 a 無效來防止重載匹配Func<int>
,要么顯式強制類型為 aAction
以便編譯器不會自行消除歧義。

TA貢獻1829條經驗 獲得超4個贊
你可以為 for 添加一個強制轉換Action
,盡管它確實有點LISP'y與所有括號:
M((Action)(() => throw new Exception()));
不理想,但如果你想要最大的清晰度:
Action thrw = () => throw new Exception();M(thrw);

TA貢獻1852條經驗 獲得超1個贊
一種可能的方法是使用命名參數:
public static void M(Action action) { /* do stuff */ }
public static void M(Func<int> func) { /* do stuff */ }
public static void Main()
{
M(action: () => throw new Exception());
}
這可能應該記錄在代碼中,以免讓下一個開發人員感到驚訝,并且如注釋中所述,編寫適當的自動化測試來驗證調用了正確的重載。
- 4 回答
- 0 關注
- 142 瀏覽
添加回答
舉報