[英]Why Conditional attribute methods aren't allowed to return other than void
我最近开始通过一本好书学习 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
,如文档中所写?
如果将此特性应用于不返回 void 的方法,您将在 Visual Studio 中收到编译错误。
我已经搜索了信息,但没有找到任何解释。
编译器不允许它,因为如果它被允许,那么像下面这样的代码的语义将是未定义的,或者充其量是相当难以理解的:
var x = someMethod(foo());
[System.Diagnostics.Conditional("DEBUG")]
public int foo()
{
return 42;
}
方法上的[Conditional("DEBUG")]
属性意味着如果存在DEBUG
符号,则该方法和对该方法的任何调用都将从编译代码中省略。
但是,如果对返回结果的foo()
的调用从编译后的代码中消失,那么将什么传递给someMethod()
呢? 或者,如果该调用随后也被删除,那么分配给x
的是什么? 如何保证本地x
甚至有一个通常会导致编译错误的值?
.NET 团队决定不采用这种方式,而是添加了一个编译时约束,即[Conditional()]
方法必须是void
方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.