2012-07-29 75 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和編譯器會很高興。