【发布时间】:2019-01-15 23:08:56
【问题描述】:
从 C# 7.0 开始 throw 关键字既可以用作表达式,也可以用作语句,这很好。
不过,请考虑这些重载
public static void M(Action doIt) { /*use doIt*/ }
public static void M(Func<int> doIt) { /*use doIt*/ }
这样调用时
M(() => throw new Exception());
甚至像这样(带有语句 lambda)
M(() => { throw new Exception(); });
编译器选择了 M(Func) 重载,表明在此将 throw 视为表达式。 如何优雅而明确地强制编译器选择 M(Action) 重载?
一种方法是这样
M(() => { throw new Exception(); return; });
但是 return 语句的原因似乎并不明显,并且冒着被下一个开发人员更改的风险,尤其是在 Resharper 警告无法访问的代码之后。
(当然我可以更改方法命名以避免重载,但这不是问题。:-)
【问题讨论】:
-
澄清问题:自 C# 3 以来,
()=>{throw...}的版本始终可分配给Func<int>;这对于 C# 7 来说并不新鲜。有趣的事实:delegate { throw new Exception(); }可分配给任何没有“out”参数的委托类型。
标签: c# lambda expression action func