【发布时间】:2017-09-26 11:59:35
【问题描述】:
我们正在为我们的 API 编写一些全局异常处理程序,我们只需要在 Debug 配置中执行某些方法,显然条件方法是可能的解决方案。
我看到的是 [Conditional("DEBUG")] 只能用于返回类型为 void 的方法,如 MSDN 所说:
条件方法受以下限制:
- 条件方法必须是类或结构中的方法 宣言。如果 Conditional 属性发生编译时错误 在接口声明中的方法上指定。
- 条件方法的返回类型必须为 void。
- 条件方法不得使用覆盖修饰符进行标记。然而,条件方法可以用 virtual 修饰符标记。这种方法的覆盖是隐含的条件,并且不能用条件属性显式标记。
- 条件方法不能是接口方法的实现。否则,会发生编译时错误。
来源:https://msdn.microsoft.com/en-us/library/aa664622(v=vs.71).aspx
我们知道标有ConditionalAttribute 的方法会到达IL,那么为什么CLR 不简单地拦截返回default(T) 的方法调用,例如因此允许具有任何类型的返回类型的方法是有条件的?还是我遗漏了什么?
【问题讨论】:
-
如果方法返回一些东西,那么省略调用会改变代码的行为,这是不可取的。
void方法在其调用中没有本地结果,可以可靠地省略它。 -
@David,我不明白省略对返回某些内容的方法的调用将如何改变代码的行为,它仍然会返回某些内容(对于发布和实际而言,它将是默认值(T)调试值),为什么不呢?
-
@Bathsheba:我明白你在说什么,虽然我不确定我是否能真正表达清楚。我很想从世界各地的 Eric Lipperts 那里得到类似这样的意见。
-
@David:这个 Eric Lippert 的观点是你的答案非常好,尽管你没有指出 void 表达式的一个重要特征,我将在评论中发表。我会让 Eric Lipperts 的其他人为自己说话。
标签: c# .net runtime clr language-design