- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我最近开始通过一本好书学习 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
属性 code 执行并且将省略对该函数的调用。
我的问题:
为什么对 Conditional
属性的使用有限制,即标有该属性的函数必须返回 void
作为 written here in the documentation ?
You will get a compilation error in Visual Studio if you apply this attribute to a method that does not return void.
我已经搜索过信息但没有找到任何解释。
最佳答案
编译器不允许它,因为如果它被允许,那么像下面这样的代码的语义将是未定义的,或者充其量是相当难以理解的:
var x = someMethod(foo());
[System.Diagnostics.Conditional("DEBUG")]
public int foo()
{
return 42;
}
方法上的[Conditional("DEBUG")]
属性意味着如果DEBUG
符号存在。
但是,如果对 foo()
的调用(返回结果)从编译后的代码中消失了,那么要将什么传递给 someMethod()
呢?或者,如果该调用随后也被删除,分配给 x
的内容是什么?如何保证本地 x
甚至有一个通常会导致编译错误的值?
.NET 团队决定不采用这种方式,而是添加了一个编译时约束,即 [Conditional()]
方法必须是 void
方法。
关于c# - 为什么不允许条件属性方法返回 void 以外的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45367707/
我已经坚持了好几天了……很抱歉遇到这样的问题,但是我只是F#本身的初学者。由于关于类型提供程序的讨论很多,所以我决定建立一个类型提供程序并撰写一篇有关它的论文。当我开始时,我不知道什么是类型提供程序。
我正在开发LAN项目唤醒功能,但是我想控制局域网中计算机是否打开。但是我不想使用ICMP或WMI(我的网络上有DC)。那么,对于此问题,是否还有其他选择,例如“套接字连接”,请检查特定端口是否正在使用
我们有一个旧的VB6应用程序,该应用程序使用Crystal Reports XI生成打印报告。我们已经通过经验发现,如果Crystal Reports打印引擎选择了错误版本的 usp10.dll (W
我正在尝试获取有效的 Android 权限列表。我知道 http://developer.android.com/reference/android/Manifest.permission.html
嗨,我是 nginx 的新手,我试图在我的服务器(运行 Ubuntu 4)上设置它,它已经运行了 apache。 所以在我 apt-get install 它之后,我尝试启动 nginx。然后我收到这
如何在VB 6中检查对象的类型-除了'TypeName'之外,是否还有其他方法,因为无法通过'TypeName'进行检查,我希望使用类似QuichWatch窗口的方法。 最佳答案 对于对象变量,请使用
我的 JSP 应用程序中有一个错误。发布后我的 session 被清除: YAHOO.util.Connect.asyncRequest('POST', Url, callback, post
我是一名优秀的程序员,十分优秀!