C# 4.0 セクション 7.5.5 より。
M が値型で宣言されたインスタンス関数メンバーの場合:
- [...]
- E が変数として分類されない場合、E の型の一時ローカル変数が作成され、E の値が変数に割り当てられます。E は、その一時ローカル変数への参照として再分類されます。一時変数は M 内でこのようにアクセスできますが、他の方法ではアクセスできません。したがって、E が真の変数 (真の変数とは何か...? ) である場合にのみ、呼び出し元は M がこれに加えた変更を観察できます。
エリック・リッパートは次のように続けています。
この点は、可変性と値によるコピーのセマンティクスの組み合わせが問題を引き起こす可能性のある別の方法を示しています。たとえば、コンストラクターの実行後、読み取り専用フィールドは変数として分類されません。したがって、値型の読み取り専用フィールドの内容を変更するメソッドを呼び出そうとすると成功しますが、実際にはコピーが変更されます! 可変値型を完全に避けることで、これらの問題を回避してください。
Eric が説明したシーンを再現するにはどうすればよいですか? 以下を試しました。私が期待するようにそれはエラーになります:
struct A
{
public readonly int mutableReadonlyField;
public A(int originalValue)
{
mutableReadonlyField = originalValue;
}
public A MethodThatMutatesTheContentsOfAReadOnlyField(int mutate)
{
this.mutableReadonlyField = mutate;//Constructor has run so mutableReadonlyField is a temporary local variable
//ERROR: A readonly field cannot be assigned to (except in a constructor or a variable initializer)
A newA = this;//Is this a true variable?
return newA;
}
}