我最近开始用一本好书学习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中出现编译错误.
我已经搜索了信息,但没有找到任何解释.
编译器不允许它,因为如果它被允许的,那么代码像下面的语义将是不确定的,或者充其量相当费解:
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方法。
| 归档时间: |
|
| 查看次数: |
1105 次 |
| 最近记录: |