为什么不允许条件属性方法返回除void之外的其他方法

时间:2017-07-28 07:44:50

标签: c# .net

我最近开始用一本好书学习C#,现在阅读Conditional属性和#if编译器指令。

我知道#if编译器指令的用法:

#if DEBUG
public void foo(int value)
{ ... }
#endif

Conditional属性:

[System.Diagnostics.Conditional("DEBUG")]
public void foo(int value)
{ ... }

我也知道#if ... #endif语句所包含的代码没有到达IL,但是Conditional属性代码和调用该功能将被忽略。

我的问题:
为什么对Conditional属性用法有限制,使用该属性标记的函数必须将void作为written here in the documentation返回?

  

如果将此属性应用于不返回void的方法,则会在Visual Studio中出现编译错误。

我已经搜索了相关信息,但没有找到任何解释。

1 个答案:

答案 0 :(得分:4)

编译器不允许它,因为这样的代码的语义将是未定义的,或者至多难以理解:

[System.Diagnostics.Conditional("DEBUG")]
public int foo()
{ ... }

var x = someOtherMethod(foo());

方法的[Conditional("DEBUG")]属性意味着如果" DEBUG"那么从编译的代码中省略对该方法的调用。符号存在。

但如果对foo()的调用从已编译的代码中消失,那么传递给someOtherMethod()的内容是什么?或者如果该呼叫也被删除,那么分配给x的内容是什么?如何保证本地x甚至有一个值,这通常会导致编译错误?

.NET团队决定不采用这种方式,而是添加了编译时约束,[Conditional()]方法必须是void方法。