这是一个C#bug吗?

时间:2012-07-29 14:22:04

标签: c#

下面的代码在VS2010中给出了编译时错误:

Use of unassigned local variable '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#错误...... :(

6 个答案:

答案 0 :(得分:12)

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

因此,在不设置值的情况下使用error会导致错误。

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

leveldb_memory error = null;

答案 1 :(得分:9)

不,leveldb_open可能会抛出异常,导致error无法设置。

答案 2 :(得分:1)

在您的代码中,永远不会为变量Error赋值。我不确定怎么回答这个问题?这肯定不是c#bug。

答案 3 :(得分:1)

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

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

BTW它可以在空对象上调用Validate。但default部分是隐藏错误。

答案 4 :(得分:0)

您必须先初始化error变量,然后才能将其传递给方法。

所以只需要error = null,编译器就会很开心。

答案 5 :(得分:-1)

这不是C#错误( - :
虽然您使用允许函数分配给out error的{​​{1}}没有人向您承诺,但内部有一项任务。因此你必须自己检查......