为什么ref参数不能像out参数一样被忽略?

Sel*_*enç 4 c# ref-parameters c#-7.0

C#7引入内联out参数的具体原因是ref什么?

以下内容适用于C#7:

int.TryParse("123", out _);
Run Code Online (Sandbox Code Playgroud)

但这是无效的:

public void Foo(ref int x) { }

Foo(ref _); // error
Run Code Online (Sandbox Code Playgroud)

我没有看到为什么不能将相同的逻辑应用于ref参数的原因.

JLR*_*she 10

原因很简单:因为您不允许将未初始化的变量传递给ref参数.情况一直如此,C#7中新的语法糖并没有改变这种情况.

注意:

int i;
MyOutParameterMethod(out i);  // allowed

int j;
MyRefParameterMethod(ref j);  // compile error
Run Code Online (Sandbox Code Playgroud)

C#7中的新功能允许您在使用out参数调用方法的过程中创建变量.它不会改变有关未初始化变量的规则.ref参数的目的是允许将已初始化的值传递给方法,并(可选)允许更改原始变量.方法体内的编译器语义将ref参数视为初始化变量,将out参数视为未初始化变量.在C#7中它仍然是这样.

  • 虽然准确,但这没有抓住重点。初始化为默认值是完全合理的。考虑使用预定义位置(除非提供)的“Thingie MakeThingie ( ref string locationWhereToPutThingie )”。物体不太关心它们的位置,因此它成为它们的一部分,调用者有时也可能不关心位置。`MakeThingie ( ref _ )` 看起来很简单。 (2认同)