为什么我不能在类上使用ConditionalAttribute?

时间:2014-02-21 12:47:14

标签: c# .net attributes conditional-attribute

我查看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属性才会出现此错误。如消息所述,此属性只能用于方法或属性类。例如,尝试将此属性应用于类将生成此错误。

所以看起来声明了一个属性适用于某个类,但是尝试将它应用于类会导致编译错误。

这怎么可能?这是一些硬连线的特殊情况还是什么?

2 个答案:

答案 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#编译器做了什么...我猜测除非个别方法也有这个方法,否则它不会做任何特殊的事情,因为那是它所针对的场景。