2012-07-29 90 views
3

下面这段代码给编译时错误在VS2010:它是一个C#的bug?

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#的错误... :(

+0

好吧,你没有分配任何东西...... – 2012-07-29 14:24:04

+1

'出错'分配 – Lu4 2012-07-29 14:24:41

+4

要回答标题中的问题,不,不,它不是交流#错误 – glosrob 2012-07-29 14:25:18

回答

12

error没有初始值。如果leveldb_open在设置之前抛出异常,它仍然不会有。因此使用error而未设置值可导致错误。

如果leveldb_memory是可空类型,您可以在初始化到null

leveldb_memory error = null; 
1

在你的代码中,变量错误从未赋值。我不知道要不然怎么回答这个问题?这不是一个C#这就是错误肯定。

+1

如果'leveldb_open'成功返回,它将被分配一个值 – ChrisF 2012-07-29 14:26:02

9

没有,leveldb_open可能抛出一个异常,这将导致error不进行设置。

-1

这不是一个C#错误( - :
虽然使用out error允许的功能分配给error没有人答应你因此您必须自己检查它...

+1

-1:这是不正确的,'out'强制在方法内部进行赋值。 – 2012-07-29 14:38:14

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

defaultdefault从类型w创建对象没有运行它的构造函数。 当您在try区块中执行某些操作后不会生效时, 因为代码可能会捕获异常并且不会分配错误。

顺便提一下,它可以调用Validate空对象。但default部分是为了隐藏错误。

0

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

所以只是做error = null和编译器会很高兴。