在访问之前可能不会初始化Out参数

Tar*_*rec 10 c# initialization out

为什么是下面的代码

private static List<WorkflowVariableDataSet> MergeDatasetsListBranch(out List<WorkflowVariableDataSet> datasetsList)
{
    if(datasetsList == null)
        datasetsList=new List<WorkflowVariableDataSet>();
    datasetsList=new List<WorkflowVariableDataSet>();
    return datasetsList;
}
Run Code Online (Sandbox Code Playgroud)

在第一个if语句处生成错误:

Out parameter 'datasetsList' might not be initialized before accessing.
Run Code Online (Sandbox Code Playgroud)

我知道它现在应该是未初始化的,但是这个词might表明错误在于可能未初始化的对象访问(当它甚至没有被访问时,它是引用,被检查).Ofc不会发生ref关键字,但我很好奇参考检查是如何违反out-parameters策略的.

编辑 我编辑了问题和示例:无论如何,out对象将在方法内初始化.问题是:为什么未初始化的对象不能为空?这有什么不同于:

object o;
if(o==null)
    ...
Run Code Online (Sandbox Code Playgroud)

Tim*_*ter 18

编译器错误CS0269

使用未分配的out参数'parameter'编译器无法验证out参数在使用之前是否已赋值; 分配时,其值可能未定义.在访问该值之前,请务必为被调用方法中的out参数赋值.如果需要使用传入的变量的值,请改用ref参数.

因此将out参数视为未分配.你是负责任的人.

所以只需删除if:

datasetsList = new List<WorkflowVariableDataSet>();
Run Code Online (Sandbox Code Playgroud)

如果要处理传递给此方法的列表,请使用refintead(如上所述):

  • 我没有访问未初始化的对象,但我正在检查引用。REFERENCE 怎么可能没有任何价值?如果它没有指向任何地方,它应该是 NULL。如果我这样做:`object o;` if(object==null)..` 那么它还没有初始化,但编译器不会按预期抗议。 (2认同)
  • @Tarec:你正在比较苹果和橘子.编译器错误是"out"参数特定的,因为`out`参数与其他变量不同.它必须**在不在外面的方法中初始化.该错误只是帮助您在访问/读取之前记住初始化它. (2认同)
  • 请注意,编译器总是尝试采用最短的方法,因为它最重要的要求之一是高效。考虑一下检查是否有人在**编译时**从任何地方传递“null”或初始化对象会花费多少成本(就 CPU 周期而言)。这是不可能检查的,而且无论如何都是多余的。 (2认同)