4

宣言を調べたところ、次のように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 属性でのみ発生します。メッセージにあるように、この属性はメソッドまたは属性クラスでのみ使用できます。たとえば、この属性をクラスに適用しようとすると、このエラーが発生します。

クラスに適用可能であると宣言された属性があるように見えますが、それをクラスに適用しようとすると、コンパイル エラーが発生します。

これはどのように可能ですか?それはハードワイヤードの特別なケースですか、それとも何ですか?

4

2 に答える 2

6

わかった:

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

大丈夫です:

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

よくない:

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

ConditionalAttributeクラスに適用できますが、クラスが属性 classであるという追加の制限があります。

条件付き定義に基づいてクラス全体を削除したい場合は、いいえ、それはできません。サポートされていません。各メソッドを個別にマークする必要があります。

于 2014-02-21T12:51:04.083 に答える
4

はい、ConditionalAttribute特殊なケースであり、コンパイラによって直接処理される数少ない属性の 1 つです。

その場合、コンパイラは明確に定義された動作を持たないため、混乱を避けるために、コンパイラはそれを許可しないことを選択します。

もちろん、技術的には、MSIL で でマークされた非属性クラスをConditionalAttribute作成し、それを でコンパイルしてilasm、C# プロジェクトから参照することもできます。C# コンパイラが何をするかを知ることは興味深いことです...私は推測しています個々のメソッドにもメソッドが含まれていない限り、特別なことは何もしません。それが対象となるシナリオだからです。

于 2014-02-21T12:51:54.730 に答える