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

时间:2014-02-05 12:38:28

标签: 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;
}

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

Out parameter 'datasetsList' might not be initialized before accessing.

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

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

object o;
if(o==null)
    ...

3 个答案:

答案 0 :(得分:17)

Compiler Error CS0269

  

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

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

所以只需删除if

datasetsList = new List<WorkflowVariableDataSet>();

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

答案 1 :(得分:1)

因为你是否有永远不会初始化参数的错误代码,或者有时候没有初始化它的错误代码,它仍然是同一个错误。

对于相同的错误,没有必要单独出现错误消息,具体取决于它是在全部还是仅在一个代码路径中命中;如果在初始化之前存在使用参数的单个代码路径,则它具有该错误,并且如果没有单个代码路径,则它不会。

因此,如果我们考虑:

private static List<WorkflowVariableDataSet> MergeDatasetsListBranch(out List<WorkflowVariableDataSet> datasetsList)
{
    if(_someBooleanField)
       datasetsList = null;
    if(datasetsList == null)
        datasetsList=new List<WorkflowVariableDataSet>();
    return datasetsList;
}

这里使用未初始化的参数可能会也可能不会发生,但这足以表示它具有相同的错误。

就错误而言,这两种情况之间确实没有任何显着差异。

因此,错误消息使用可能,即使在它始终适用的情况下也是如此。

答案 2 :(得分:0)

在传递之前不需要初始化out参数,调用方法需要在方法返回之前赋值。

修改了你的代码

 private static List<WorkflowVariableDataSet> MergeDatasetsListBranch(out List<WorkflowVariableDataSet> datasetsList)
            {
                return datasetsList = new List<WorkflowVariableDataSet>();
            }