这确实是这个问题的一个分支,但我认为它应该得到自己的答案。
根据 ECMA-334 的第 15.13 节(在using
声明中,以下称为resource-acquisition):
在资源获取中声明的局部变量 是只读的,并且应该包括一个初始化器。如果嵌入语句尝试修改这些局部变量(通过赋值或
++
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# 中是否未定义和/或非法?如果它是合法的,那么这段代码和上面规范的摘录有什么关系?如果它是非法的,为什么它会起作用?是否有一些微妙的漏洞允许它,或者它的工作原理仅归因于运气(因此人们不应该依赖这种看似无害的代码的功能)?