C# 为什么必须在声明点指定ref局部变量?

C# 为什么必须在声明点指定ref局部变量?,c#,cil,ref,C#,Cil,Ref,继续我进入ref-locals的旅程,我发现了另一个我不理解的限制,那就是ref-locals必须在声明时被明确指定 我明白了为什么不能通过引用一个没有明确赋值的变量来初始化它,因为这需要编译器以某种方式将变量和ref local的赋值状态联系起来 object variable; ref object reference = ref variable; variable = new object(); // Now `reference` should be definitely assign

继续我进入ref-locals的旅程,我发现了另一个我不理解的限制,那就是ref-locals必须在声明时被明确指定

我明白了为什么不能通过引用一个没有明确赋值的变量来初始化它,因为这需要编译器以某种方式将变量和ref local的赋值状态联系起来

object variable;
ref object reference = ref variable;
variable = new object();
// Now `reference` should be definitely assigned, 
// so the compiler would have to work some magic to recognize that.
但为什么这是非法的:

object variable = new object();
ref object reference;
reference = ref variable;

编译器不能将
引用
视为任何其他未明确指定的变量吗?更奇怪的是,因为从C#7.3开始,您可以重新分配ref局部变量,但这个特定的限制仍然保留在中。有一个未初始化的引用会以某种方式破坏IL吗?允许这样一个变量存在是不安全的吗?或者解除这一限制在理论上是可能的,但非常困难/不值得花时间吗?

我认为这是另一种情况。同意,允许重新分配应该允许他们放弃7.0规则。很难分析别名的含义,编译器的更改可能是实质性的。如果不是敏捷的话,这一切看起来可能都不一样,未来的版本可能会再次更改规则。我建议将此作为GSerg链接的副本关闭。我认为这是另一种情况。同意,允许重新分配应该允许他们放弃7.0规则。很难分析别名的含义,编译器的更改可能是实质性的。如果不是敏捷的话,这一切看起来可能都不一样,未来的版本很可能会再次改变规则。我建议将此作为GSerg链接的副本关闭。