はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【C#】System.Diagnostics.ConditionalAttributeは「戻り値・outがあるとNG」で「ref・inはOK」である

はじめに

今回はConditionalAttributeの制約について紹介をしたいと思います。

指定した条件付きコンパイル シンボルが定義されていない場合、メソッド呼び出しまたは属性を無視するようコンパイラに指示します。

learn.microsoft.com

最近知ったのですが、以下のケースでは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ですが、refinは使うことができます。

// 以下の書き方のコンパイルエラーにならない
[Conditional("")]
public static void RefMethod(ref int result)
{
    result = 1;
}

[Conditional((""))]
public static void InMethod(in int value)
{
    var a = value;
}

理由

どのケースも以下の理由に従います。

ConditionalAttribute は、 void以外の戻り値の型を持つメソッドには適用できません。 この理由は、メソッドの他の戻り値の型は、プログラムの別の部分で必要な場合があるからです。

コンパイラ エラー CS0578 - C# | Microsoft Learn