这是一个C#的 bug 吗?

3
以下代码在VS2010中会出现编译时错误: 使用未赋值的本地变量'error'
leveldb_memory error;

try
{
    return leveldb_open(options, name, out error); // <== Notice `out error`
}
finally
{
    Validate(error); // <== Use of unassigned local variable 'error'
}

这似乎不正确,有没有一种方法可以在不修改代码的情况下克服这个错误?


编辑

哦,好吧,这不是C#的bug... :(


好的,你没有给它分配任何东西... - Yochai Timmer
4
标题中的问题的答案是,不,这不是 C# 的 bug。 - glosrob
是的,但它不在 finally 的范围之内。如果函数调用失败会怎样?错误将保持未分配状态。 - Yochai Timmer
6个回答

12

error 没有初始值。如果在设置它之前 leveldb_open 抛出异常,它仍然没有初始值。

因此,如果使用未设置值的 error 可能会导致错误。

如果 leveldb_memory 是可空类型,则可以将其初始化为 null

leveldb_memory error = null;

9

不,leveldb_open 可能会抛出异常,这将导致 error 没有被设置。


1
leveldb_memory error = default( levelldb_memory );
try {
    return leveldb_open( options, name, out error );
} finally {
    Validate( error );
}

default 可以在不运行构造函数的情况下创建类型对象。 当您在 try 块中执行某些操作时,它不会影响其后面的内容, 因为代码可以捕获异常并且不会分配错误。

顺便说一句,可以在空对象上调用 Validate。但是 default 部分是为了隐藏错误。


1
在你的代码中,变量Error从未被赋值。我不确定还有什么其他答案可以回答这个问题?这肯定不是C#的bug。

1
如果 leveldb_open 成功返回,它将被分配一个值。 - ChrisF

0

在将error变量传递给该方法之前,必须对其进行初始化。

所以只需执行error = null,编译器就会很高兴了。


-1

这不是C#的错误 (-:
虽然你使用了out error,允许函数将值分配给error,但没有人保证里面有赋值。因此你必须自己检查...


1
-1:那不正确。out 强制在方法内进行赋值。 - Daniel Hilgarth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接