我查看ConditionalAttribute
声明,声明如下:
我发现JavaScript代码如下:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method,
AllowMultiple = true)]
public sealed class ConditionalAttribute : Attribute {
//whatever
}
和AttributeTargets.Class
声称属性可以应用于某个类。所以我尝试了这个:
[Conditional("DEBUG")]
class MyClass
{
}
但编译器发出以下错误
错误CS1689:属性'System.Diagnostics.ConditionalAttribute'仅对方法或属性类有效
和MSDN说
只有ConditionalAttribute属性才会出现此错误。如消息所述,此属性只能用于方法或属性类。例如,尝试将此属性应用于类将生成此错误。
所以看起来声明了一个属性适用于某个类,但是尝试将它应用于类会导致编译错误。
这怎么可能?这是一些硬连线的特殊情况还是什么?
答案 0 :(得分:5)
好:
[Conditional("DEBUG")]
public void foo() { }
好吧:
[Conditional("DEBUG")]
public class BarAttribute : Attribute { }
不行:
[Conditional("DEBUG")]
public class Baz { }
ConditionalAttribute
可以应用于类,但该类的附加限制是属性类。
如果你想根据条件定义删除整个类,那么不,你不能这样做。它不受支持。您必须单独标记每种方法。
答案 1 :(得分:3)
是的,ConditionalAttribute
是一种特殊情况,是由编译器直接专门处理的少数几个属性之一。
在这种情况下编译器没有明确定义的行为,所以它选择不让你这样做,以避免混淆。
当然,从技术上讲,你可以在MSIL中编写一个标有ConditionalAttribute
的非属性类,用ilasm
编译它,然后从C#项目中引用它 - 它会很有趣知道C#编译器做了什么...我猜测除非个别方法也有这个方法,否则它不会做任何特殊的事情,因为那是它所针对的场景。