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

And*_*ing 6 .net c#

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

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

#if DEBUG
public void foo(int value)
{ ... }
#endif
Run Code Online (Sandbox Code Playgroud)

Conditional属性:

[System.Diagnostics.Conditional("DEBUG")]
public void foo(int value)
{ ... }
Run Code Online (Sandbox Code Playgroud)

我也知道被#if... #endif语句包含的代码没有到达IL但是Conditional属性代码会这样做,并且对该函数的调用将被省略.

我的问题:
为什么有关于限制Conditional属性的使用,标志着与属性函数必须返回void作为这里的文件中写

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

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

Pet*_*r B 9

编译器不允许它,因为如果它允许的,那么代码像下面的语义将是不确定的,或者充其量相当费解:

var x = someMethod(foo());

[System.Diagnostics.Conditional("DEBUG")]
public int foo()
{
    return ...
}
Run Code Online (Sandbox Code Playgroud)

[Conditional("DEBUG")]方法上的属性意味着如果存在符号,则编译代码中将省略该方法和对该方法的任何调用DEBUG

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

.NET 团队决定不走这条路,而是添加了一个编译时约束,即[Conditional()]方法必须是void方法。