JetBrains Rider 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() のようにオブジェクトの状態を変更するメソッドのみです。 同様の状況で 純粋 メソッドを呼び出す場合は、コピー上で呼び出しても状態が変わらず、いずれにしてもメソッドから期待した結果が得られるので問題ありません。

偽陽性

残念ながら、JetBrains Rider はメソッドが純粋かどうかを常に判断できるとは限らず、そのためこのインスペクションが誤検知の警告を出すことがありますが、 [Pure] でアノテーションされたメソッド(JetBrains.Annotations.PureAttributeSystem.Diagnostics.Contracts.PureAttribute の両方を使用できます)は常に 純粋と見なされ、警告は表示されません。

.NET Framework やその他のよく使用されるライブラリの多くのメソッドは、 [Pure]外部アノテーション によって注釈付けされていることに注意してください。

問題を修正する

JetBrains Rider はこのインスペクションに対して クイックフィックスを提供していません。

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

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

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

2026 年 6 月 12 日