-3

現在、クラス A のクラス B の値が入力された文字列配列を使用しようとしています。

配列をそのままコピーしようとしました

string[] playerHand2 = new string[5];
Array.Copy(Deck.playerHand, playerHand2, 5);

ただし、次のようにコンテンツを表示しようとすると、null 参照例外が発生します。

Console.WriteLine("Players hand:");
foreach (var item in playerHand2)
{
      Console.Write(item.ToString());
}

私を正しい方向に向けてくれるどんな広告も大歓迎です。

4

3 に答える 3

1

の項目の 1 つDeck.playerHandが既に null でした。

この null 値は にコピーされplayerHand2ます。

を反復処理するplayerHand2と、null.ToString()が呼び出され、NullReferenceException.

次の方法で null 値を確認できます。

bool hasNulls = Array.IndexOf(Deck.playerHand, null) > 0;

またはLINQを使用:

bool hasNulls = Deck.playerHand.Any(s => s == null);
于 2013-05-05T09:47:50.253 に答える
1

次のコードは、私にとっては問題なく機能します。

    string[] playerHand = new string[7] { "1", "2", "3", "4", "5", "6", "7" };
    string[] playerHand2 = new string[5];
    Array.Copy(playerHand, playerHand2, 5);

    Console.WriteLine("Players hand:");
    foreach (var item in playerHand2)
    {
        Console.Write(item.ToString());
    }

実際に配列「playerHand」に有効なデータを入力しましたか? それ以外の場合は、'playerHand' の配列に null 値がないことを確認し、'playerHand' のサイズは少なくとも 'playerHand2' と同じ大きさでなければなりません。

それ以外の場合は、単にこれを回避できます

 foreach (var item in playerHand2)
        {
            if (string.IsNullOrEmpty(item)) { continue; }
            Console.Write(item.ToString());
        }
于 2013-05-05T09:49:39.297 に答える
1

配列をコピーして使用する必要はありません。また、文字列を文字列に変換しても役に立ちません。

以下を簡単に使用できます。

foreach (var item in Deck.playerHand)
{
   Console.WriteLine(item);
}

null一般に、以下を使用して " " で上書きすることもできます。

for(int x = 0; x < Deck.playerHand.Length; x++)
{
   if(Deck.playerHand[x] == null)
   {
      Deck.playerHand[x] = " ";
   }
}

次のコードを与える組み合わせ:

for(int x = 0; x < Deck.playerHand.Length; x++)
{
   if(Deck.playerHand[x] == null)
   {
      Deck.playerHand[x] = " ";
   }
   Console.WriteLine(Deck.playerHand[x]);
}

またはさらにコンパクトです。@saravanan を参照してください。

foreach(string item in Deck.playerHand)
{
   Console.Write(!string.IsNullOrEmpty(item)?item.ToString():"");
}
于 2013-05-05T09:53:09.607 に答える