我最近开始用一本好书学习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中出现编译错误。
我已经搜索了相关信息,但没有找到任何解释。
答案 0 :(得分:4)
编译器不允许它,因为这样的代码的语义将是未定义的,或者至多难以理解:
[System.Diagnostics.Conditional("DEBUG")]
public int foo()
{ ... }
var x = someOtherMethod(foo());
方法的[Conditional("DEBUG")]
属性意味着如果" DEBUG"那么从编译的代码中省略对该方法的调用。符号存在。
但如果对foo()
的调用从已编译的代码中消失,那么传递给someOtherMethod()
的内容是什么?或者如果该呼叫也被删除,那么分配给x
的内容是什么?如何保证本地x
甚至有一个值,这通常会导致编译错误?
.NET团队决定不采用这种方式,而是添加了编译时约束,[Conditional()]
方法必须是void方法。