繁体   English   中英

为什么不允许条件属性方法返回 void 以外的值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM