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

时间:2017-04-14 13:22:49

标签: c# c#-7.0 ref-parameters

C#7带来内联out参数但不是ref的具体原因是什么?

以下内容适用于C#7:

int.TryParse("123", out _);

但这是无效的:

public void Foo(ref int x) { }

Foo(ref _); // error

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

1 个答案:

答案 0 :(得分:10)

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

观察:

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

int j;
MyRefParameterMethod(ref j);  // compile error

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