2013-03-06 41 views
0
bool _Error = false; 
ThesResult _tr; 
try { _tr = engine["en"].LookupSynonyms(_Word, true); } 
catch (Exception) 
{ 
    _Error = true; 
} 
if (_Error) 
{ 
    _Synonyms.Add(word); 
} 
else 
{ 
    List<string> SynonymNew = new List<string>(); 
    foreach (ThesMeaning meaning in _tr.Meanings) 

該錯誤發生在底線_tr.Meanings。我不知道如何解決這個問題,從邏輯上看,一切似乎都沒問題,但我需要找到一種方法讓編譯器看到。使用未分配的本地變量'_tr'

回答

2

設置_trnull當你聲明它。編譯器發現它有可能沒有被初始化。

1

在使用之前,您必須指定_tr的值。如果你想喝沒有水的收件人的水,那麼你什麼也不喝,是嗎?

在你的代碼的嘗試部分,它不能保證它會得到一個值_tr,所以你必須在使用它之前初始化你的變量,至少使用null。

1

你需要在使用前分配null至少對象:

bool _Error = false; 
ThesResult _tr = null; 
try { _tr = engine["en"].LookupSynonyms(_Word, true); } 
catch (Exception) 
     { 
      _Error = true; 
     } 
     if (_Error) 
     { 
      _Synonyms.Add(word); 
     } 
     else 
     { 
        List<string> SynonymNew = new List<string>(); 
        foreach (ThesMeaning meaning in _tr.Meanings) 
0

當初始化設置_tr = NULL

ThesResult _tr = null; 
1

C#,您需要保證一個變量已經被分配在嘗試使用它之前的一個值。在這種情況下,如果LookupSynonyms方法拋出異常,那麼_tr將永遠不會得到值,甚至不會得到null

所以它不會讓你編譯,除非你可以保證你在使用它之前至少給變量指定了一些東西(甚至null)。

這與其他一些自動將變量初始化爲默認值(如null或零或其他任何值)或其他語言(C++)的變量(無論發生什麼那時的內存地址)。

3

我打算繼續說,也許您可​​能想重新考慮您的操作順序。 try... catch (set flag) if(flag)接近反模式。有幾個很好的理由這樣做:

  • 它不是寫
  • 您還沒有分配額外的內存這樣
  • 您正在使用的變量較少的代碼(我的猜測最清晰的方式是,_Error未在其他地方使用)

    bool _Error = false; 
    // ThesResult _tr; <!-- only needed in the try block. 
    try { 
        ThesResult _tr = engine["en"].LookupSynonyms(_Word, true); 
        List<string> SynonymNew = new List<string>(); 
        // no worries about initializing it to null. 
        foreach (ThesMeaning meaning in _tr.Meanings) 
        // your loop and the rest of the function. 
    } 
    catch (Exception) 
    { 
        _Synonyms.Add(word); // is this supposed to be _Word? 
    } 
    
+0

+1我只是在我的回答表明這。 – Nick 2013-03-06 15:58:34

相關問題