はじめに
今回はConditionalAttribute
の制約について紹介をしたいと思います。
指定した条件付きコンパイル シンボルが定義されていない場合、メソッド呼び出しまたは属性を無視するようコンパイラに指示します。
最近知ったのですが、以下のケースではConditionalAttribute
は利用できないみたいです。
- 戻り値がある場合
- 引数に
out
パラメーター修飾子がある場合
具体例を見ながら紹介します。
制約
戻り値があるとき
戻り値があるときはConditional
属性は使えません。
// この書き方はコンパイルエラーになってしまう [Conditional("")] public static int NGMethod() { return 1; }
outパラメーター修飾子があるとき
out
パラメーター修飾子があるときはConditional
属性は使えません。
// この書き方はコンパイルエラーになってしまう [Conditional("")] public static void NGMethod2(out int result) { result = 1; }
ref・inパラメーター修飾子はOK
out
はNGですが、ref
・in
は使うことができます。
// 以下の書き方のコンパイルエラーにならない [Conditional("")] public static void RefMethod(ref int result) { result = 1; } [Conditional((""))] public static void InMethod(in int value) { var a = value; }
理由
どのケースも以下の理由に従います。
ConditionalAttribute は、 void以外の戻り値の型を持つメソッドには適用できません。 この理由は、メソッドの他の戻り値の型は、プログラムの別の部分で必要な場合があるからです。