ReSharper 2026.1 Help

契約アノテーション

契約アノテーションを使うことで、特定の入力に対して期待される出力を定義したり、言い換えれば、関数の参照型やブール値引数と戻り値の間の依存関係を定義できます。 契約アノテーションの仕組みにより、より簡単かつ安全に利用できる API を作成できます。

[ContractAnnotationAttribute] を使って関数を装飾することによって契約アノテーションを実装することができます。 あなたのソースコード、 JetBrains.Annotations 名前空間を参照するでそれをやりたいなら。 外部アノテーション を使用して既存のバイナリモジュール内の関数にアノテーションを付けることもできます。

仕組み

どのようにして契約上のアノテーションを使用することができるのかを簡単に理解するには、以下の例を参照してください。

この例では、 Adjust 関数を contract アノテーション属性で修飾しました。 この場合の属性引数は、null 引数が常に NULL を返すことを意味します。 この例のコードを読んで、このように機能することを簡単に確認できますが、現実のコードでは、この依存関係はそれほど明白ではないかもしれません。 ここでの主なものは、関数が入力値をどのように扱うかを記述する契約アノテーション属性です。

Adjust 関数を 'null' 引数で呼び出すと、ReSharper は一度に多くの問題を 発見してハイライトします。 まず第一に、この式が常に null であることを警告しながら、null 引数を持つ関数呼び出しをハイライトします。 それから、この式で初期化された adjusted 変数を追跡し続け、現在は 'null' でもあります。 adjusted 変数の 'null' でないことを確認すると、ReSharper はこの比較が常に false であることを再度警告します。 最後に、ReSharper は 'if' ステートメント内のコードを到達不能としてグレー表示します:

契約アノテーションに基づく ReSharper のコードインスペクション

契約アノテーションの構文

契約アノテーションの入出力関係の依存関係を指定するには、次の構文を使用します。

[ContractAnnotation("[paramName:][input] => output [; [paramName:][input] => output]", [forceFullStates:true])]

input は次のいずれかです。

  • 参照型パラメーターの null/notnull

  • ブールパラメーターの true/false

output は次のいずれかになります。

  • 参照型の戻り値の null/notnull/canbenull

  • ブール型の戻り値の true/false

  • halt | stop | void | nothing (交換可能)は、関数が正常に戻らないことを示します。 つまり、例外をスローするか、プログラムの実行を停止します。

オプションのブール forceFullStates パラメーター(デフォルトでは false)を使用すると、nullability 分析の 悲観的モードを強制できます。 つまり、メソッドの戻り値が契約条件で定義されていない場合、ReSharper は null である可能性があると想定します。

備考:

  • パラメーターが 1 つだけの場合、 paramName を省略できます(上記の例を参照)

  • パラメーターがない場合は、 paramNameinput の両方を省略できます:

    [ContractAnnotation("=> halt")] public void TerminationMethod()

    または、入力に関係なく関数が同じ出力を持つ場合:

    [ContractAnnotation("=> halt")] public void TerminationMethod(object data, bool flag)
  • 同じパラメーターに対して複数の条件を追加できます。

    [ContractAnnotation("input:null => null; input:notnull=>notnull")] public object Transform(object input, bool flag)
  • 条件を逆にすることもできます。つまり、 input => outputoutput <= input と等しいです:

    [ContractAnnotation("null <= surname:null")] public string GetName(string surname)
  • 'out' パラメーターの期待値を指定することもできます。 同じ入力条件に対して戻り値と出力パラメーターの両方を指定する場合は、コンマを使用します。

    [ContractAnnotation("s:null => false,result:null")] public bool TryParse(string s, out object result)

契約条件の検証

ソースコードで契約アノテーションを関数に付与すると、ReSharper は関数シグネチャーに従って契約条件を検証します。 契約アノテーションが関数パラメーターに合わない場合、ReSharper は警告を表示します:

ReSharper: 契約アノテーション

契約アノテーションが戻り値に合わない場合も同じことが起こります。

ReSharper: 契約アノテーション
2026 年 6 月 12 日