Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在访问之前,Out参数可能未初始化_C#_Initialization_Out - Fatal编程技术网

C# 在访问之前,Out参数可能未初始化

C# 在访问之前,Out参数可能未初始化,c#,initialization,out,C#,Initialization,Out,下面的代码是什么 private static List<WorkflowVariableDataSet> MergeDatasetsListBranch(out List<WorkflowVariableDataSet> datasetsList) { if(datasetsList == null) datasetsList=new List<WorkflowVariableDataSet>(); datasetsList=

下面的代码是什么

private static List<WorkflowVariableDataSet> MergeDatasetsListBranch(out List<WorkflowVariableDataSet> datasetsList)
{
    if(datasetsList == null)
        datasetsList=new List<WorkflowVariableDataSet>();
    datasetsList=new List<WorkflowVariableDataSet>();
    return datasetsList;
}
我知道在这一点上它应该是未初始化的,但是单词
可能表明错误在于可能的未初始化对象访问(当它甚至没有被访问时,它是被检查的引用)。Ofc这不会发生在
ref
关键字上,但我很好奇引用检查是如何违反参数策略的

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

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

使用未分配的参数“parameter”编译器无法 验证
out
参数在使用前已分配值; 赋值时,其值可能未定义。请确保为其指定一个值 在访问值之前,请在被调用的方法中输出参数。如果你 需要使用传入变量的值,请使用
ref
参数 相反

因此,将
out
-参数视为未赋值。你是负责的人

因此,如果
,只需删除

datasetsList = new List<WorkflowVariableDataSet>();
datasetsList=newlist();

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

因为无论您的错误代码是从不初始化参数,还是有时不初始化参数,都是相同的错误

对于同一个bug,根据它是在所有代码路径中命中还是仅在一个代码路径中命中,没有必要为它提供单独的错误消息;如果在初始化之前使用参数的地方有一个代码路径,那么它就有这个错误,如果没有一个代码路径,那么它就没有

因此,如果我们考虑:

private static List<WorkflowVariableDataSet> MergeDatasetsListBranch(out List<WorkflowVariableDataSet> datasetsList)
{
    if(_someBooleanField)
       datasetsList = null;
    if(datasetsList == null)
        datasetsList=new List<WorkflowVariableDataSet>();
    return datasetsList;
}
private static List MergeDatasetsListBranch(out List datasetsList)
{
if(_someBooleanField)
datasetsList=null;
if(datasetsList==null)
datasetsList=新列表();
返回数据集列表;
}
在这里,使用未初始化的out参数可能会发生,也可能不会发生,但这足以说明它具有相同的错误

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


因此,即使在始终应用错误消息的情况下,错误消息也可能会使用。

Out参数在传递之前不需要初始化,调用方法需要在方法返回之前分配一个值

修改了你的代码

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

我没有问如何解决这个问题。这是显而易见的。我在问为什么不能将未初始化的对象引用与
null
进行比较。我不是在访问未初始化的对象,而是在检查引用。引用怎么可能没有任何值?如果它不指向任何地方,它应该为NULL。如果我愿意:
objecto
如果(object==null)
则它未初始化,但编译器不会按预期进行抗议。@Tarec:您正在比较苹果和桔子。编译器错误是特定于参数的
out
,因为
out
参数与其他变量不同。它必须在方法中初始化,而不是在外部。该错误只是帮助您记住在访问/读取之前对其进行初始化。@Tarec:no,如果调用方通过列表,此时可以初始化
out
-参数。因此,您甚至可以在调试器中看到它的值,但无法访问它。但是编译器不需要关心,因为规则是严格的:在没有在这个方法中分配任何内容之前,不要碰它。请注意,编译器总是尝试采用最短的方法,因为它最重要的要求之一是高效。考虑一下,如果检查某人是否通过了<代码> null <代码>,或者从编译时的任何地方初始化对象,那么要花费多少钱(在CPU周期上)。这是不可能检查的,而且它是多余的。我已经编辑了示例:它将始终在方法中初始化,错误保持不变。不,不会,在初始化之前,您仍在测试
如果(datasetsList==null)
。这既是一个错误,也是多余的(它不能为null,因为它没有被设置为任何值——包括null——那么为什么要测试呢?)
 private static List<WorkflowVariableDataSet> MergeDatasetsListBranch(out List<WorkflowVariableDataSet> datasetsList)
            {
                return datasetsList = new List<WorkflowVariableDataSet>();
            }