为什么代码如下
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)
...
答案 0 :(得分:17)
使用未分配的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>();
}