C# 为什么可以';我不能在类上使用条件属性吗?

C# 为什么可以';我不能在类上使用条件属性吗?,c#,.net,attributes,conditional-attribute,C#,.net,Attributes,Conditional Attribute,我查看ConditionalAttribute声明,声明如下: [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)] public sealed class ConditionalAttribute : Attribute { //whatever } 我发现JavaScript代码如下所示: [AttributeUsage(AttributeTargets.C

我查看
ConditionalAttribute
声明,声明如下:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method,
   AllowMultiple = true)]
public sealed class ConditionalAttribute : Attribute {
  //whatever
}
我发现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属性中发生。如消息所述,此属性只能用于方法或属性类。例如,尝试将此属性应用于类将生成此错误

因此,似乎有一个属性声明为适用于类,但尝试将其应用于类会导致编译错误

这怎么可能?这是什么硬接线的特殊情况吗?

好的:

[Conditional("DEBUG")]
public void foo() { }
也可以:

[Conditional("DEBUG")]
public class BarAttribute : Attribute { }
不好:

[Conditional("DEBUG")]
public class Baz { }
ConditionalAttribute
可以应用于类,但类作为属性类还有一个附加限制


如果您希望根据条件定义删除整个类,那么不,您不能删除它。它不受支持。您必须单独标记每个方法。

是的,
ConditionalAttribute
是一个特例,是编译器专门直接处理的少数几个属性之一

在这种情况下,编译器将没有定义良好的行为,因此它选择不让您这样做,以避免混淆


当然,从技术上讲,您可以在MSIL中编写一个标有
ConditionalAttribute
的非属性类,用
ilasm
编译该类,然后从C#项目中引用它-了解C#编译器的功能会很有趣。。。我猜除非单个方法也有该方法,否则它不会有什么特别的作用,因为这是它所针对的场景。

OP声明:“看起来有一个属性声明适用于类,但试图将其应用于类会导致编译错误。”我认为,它是否可以应用到类中确实存在一些困惑。我真的很喜欢这里的例子,FWIW;一定的upvote@dcastroOP注意到“看起来有一个属性被声明为适用于一个类,但试图将其应用于一个类会导致编译错误。”-Athari展示了一个示例,其中该属性应用于一个没有编译错误的类。这个澄清是值得的。哈哈。没有检查用户。一整天都在回答愚蠢的问题,我被迷住了D