ReSharper 2026.1 Help

コードインスペクション: おそらく不純な構造体メソッドが readonly 変数で呼び出されています: 構造体値は呼び出し前に常にコピーされます。

次のコードを考えてみましょう:

class Test { struct MyStruct { public int Value; public void IncrementValue() { Value +=1; } } readonly MyStruct _readonlyStruct = new MyStruct(); public void RunTest() { // Warning: Impure method is called for readonly field of value type _readonlyStruct.IncrementValue(); Console.WriteLine(_readonlyStruct.Value); // 0 } }

最終的に出力に 0 が含まれることになりますが、事前に IncrementValue() を呼び出すと 1 になるはずです。 これは、値型の readonly フィールドにアクセスすると、呼び出し元がフィールドを変更できないように、そのコピーが作成されるために発生します。

上記の例の _readonlyStruct.IncrementValue() は、 _readonlyStruct のコピーを作成し、その Value フィールドを 1 に変更してから、コピーを破棄します。

ただし、このような問題は 不純なメソッド、つまり IncrementValue() のようにオブジェクトの状態を変更するメソッドでのみ発生します。 同様の状況で 純粋メソッドを呼び出す場合は、コピー上で呼び出されるかどうかに関係なく状態が変わらず、いずれにせよ期待通りの結果が得られます。

偽陽性

残念ながら、ReSharper はメソッドが純粋かどうかを常に判定できるわけではないため、このインスペクションが誤検知の警告を出すことがありますが、 [Pure] でアノテーションされたメソッド(JetBrains.Annotations.PureAttribute および System.Diagnostics.Contracts.PureAttribute の両方を使用できます)は常に 純粋 とみなされ、警告は出ません。

.NET Framework および他のよく使われるライブラリの多くのメソッドは、 外部アノテーションを通じて [Pure] でアノテーションされています。

問題を修正する

ReSharper はこのインスペクション用の クイックフィックスを提供していません。

フィールドの状態を変更することがコード内で意図されている場合は、 readonly 修飾子を削除することによってフィールドを変更可能にすることができます。

フィールドを不変にしたい場合は、フィールドに対して不純なメソッドが呼び出されないようにコードを書き直す必要があります。

呼び出されたメソッドが純粋で、警告が誤検知である場合は、 [Pure]アノテーションを付けるかこのインスペクションを抑制することができます。

2026 年 6 月 12 日