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

4

我查阅了ConditionalAttribute的声明,它是这样声明的:

我找到了以下JavaScript代码:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method,
   AllowMultiple = true)]
public sealed class ConditionalAttribute : Attribute {
  //whatever
}

AttributeTargets.Class 被认为是指 Attribute 可以应用于类。 因此我尝试了以下代码:

[Conditional("DEBUG")]
class MyClass
{
}

但编译器会发出以下错误:

error CS1689:属性“System.Diagnostics.ConditionalAttribute”仅对方法或属性类有效

MSDN表示:

只有在 ConditionalAttribute 属性中才会出现此错误。正如消息所述,此属性仅可用于方法或属性类。例如,尝试将此属性应用于类将生成此错误。

因此,看起来已声明了适用于类的属性,但尝试将其应用于类会导致编译错误。
这是如何可能的?这是一些硬编码的特殊情况吗?
2个回答

6

好的:

[Conditional("DEBUG")]
public void foo() { }

好的,太好了:
[Conditional("DEBUG")]
public class BarAttribute : Attribute { }

不可以:

[Conditional("DEBUG")]
public class Baz { }

ConditionalAttribute可以应用于类,但该类必须是一个属性类才行。

如果你想根据条件定义删除整个类,那么不行,这是不支持的。你必须逐个标记每个方法。


OP表示:“看起来似乎有一个被声明为可应用于类的属性,但试图将其应用于类会导致编译错误。”在我看来,确实存在一些混淆,不确定它是否可以应用于类。 - Athari
我非常喜欢这里的例子,顺便说一下;肯定点赞。 - Marc Gravell
@dcastro OP指出:“看起来有一个属性声明适用于一个类,但尝试将其应用于一个类会导致编译错误。”- Athari展示了一个例子,在这个例子中它被应用到一个类上而没有编译错误。这个澄清是值得的。 - Marc Gravell
1
哦,哈哈。没有检查用户。整天回答愚蠢的问题,有点失态了。:D - Athari

4
是的,ConditionalAttribute 是一个特殊情况,它是少数几个被编译器直接处理的属性之一。
在这种情况下,编译器没有明确定义的行为,因此选择不让您这样做,以避免混淆。
当然,从技术上讲,您可以编写一个未用作 attribute 的类,并用 ConditionalAttribute 进行标记,使用 ilasm 编译该类,然后从 C# 项目中引用它——很有趣,想知道 C# 编译器会怎么做...我猜除非单个方法也使用了该方法,否则它不会进行任何特殊处理,因为这是它所针对的场景。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接