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 でエラーが発生します。これを修正する方法がわかりません。論理的にはすべて問題ないように見えますが、コンパイラにそれを認識させる方法を見つける必要があります。

4

6 に答える 6

3

私は先に進み、おそらくあなたは操作の順序を再考したいと思うかもしれないと言います. try... catch (set flag) if(flag)アンチパターンに近い。これにはいくつかの正当な理由があります。

  • コードを記述する最も明確な方法ではありません
  • この方法で余分なメモリを割り当てていません
  • 使用する変数が 1 つ少なくなります (私の推測では、_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?
    }
    
于 2013-03-06T15:57:03.913 に答える
2

宣言時に設定_trします。nullコンパイラは、初期化されていない可能性があることを認識しています。

于 2013-03-06T15:52:23.953 に答える
1

You must assign the value of _tr before using it. If you want to drink water from a recipient with no water, then you are not drinking anything, are you?

In the try part of your code it cannot guarantee that it will get a value for _tr , so you must initialize your variable yourself before using it, at least with null.

于 2013-03-06T15:51:49.227 に答える
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)
于 2013-03-06T15:52:40.350 に答える
1

C# requires that you guarantee that a variable has been assigned a value before trying to use it. In this case, if the LookupSynonyms method throws an exception, then _tr will never get a value, not even null.

So it won't let you compile unless you can guarantee that you've at least assigned something (even null) to the variable before you use it.

This is unlike some other languages (VB) which automatically initialize a variable to its default value (like null or zero or whatever), or other languages (C++) which the variable starts out as garbage (whatever happened to be in that memory address at the time).

于 2013-03-06T15:54:27.363 に答える
0

When initializing set _tr = null

ThesResult _tr = null;
于 2013-03-06T15:53:22.157 に答える