これは本当にこの質問の派生物ですが、それはそれ自身の答えに値すると思います。
ECMA-334のセクション15.13によると(using
ステートメントでは、以下ではリソース取得と呼ばれます):
リソース取得で宣言されたローカル変数 は読み取り専用であり、初期化子を含める必要があります。
++
埋め込みステートメントがこれらのローカル変数を(代入またはand演算子を介して)変更しようとしたり、または パラメーター--
として渡したりしようとすると、コンパイル時エラーが発生します。ref
out
これは、以下のコードが違法である理由を説明しているようです。
struct Mutable : IDisposable
{
public int Field;
public void SetField(int value) { Field = value; }
public void Dispose() { }
}
using (var m = new Mutable())
{
// This results in a compiler error.
m.Field = 10;
}
しかし、これはどうですか?
using (var e = new Mutable())
{
// This is doing exactly the same thing, but it compiles and runs just fine.
e.SetField(10);
}
上記のスニペットはC#で未定義および/または違法ですか?それが合法である場合、このコードと上記の仕様からの抜粋との関係は何ですか?それが違法である場合、なぜそれが機能するのですか?それを可能にする微妙な抜け穴がありますか、それとも単なる運に起因するだけで機能するという事実がありますか(そのため、そのような一見無害に見えるコードの機能に依存するべきではありません)?