2011-03-04 9 views
1

私はC#のジェネリックスについて学んでいますが、ジェネリック配列を作成して文字列を追加しようとしています。私は簡単にそれにintの値を追加することができますが、私はそれをstringsと動作させる方法を理解できません。私は文字列を使用しようとしているときに私はNullReferenceExceptionを得る。一般的な文字列にデータを追加する配列C#

私はmyArrayというクラスを持って、それは次のようになります。

は私のメインフォームで
class MyArray<T> : IComparable<T>, IEnumerable<T>, IEnumerator<T> 
{ 
    T[] data = new T[10]; 
    int current = -1; 

    public T[] Data 
    { 
     get { return data; } 
    } 

    public void Add(T value) 
    { 
     for (int i = 0; i < data.Length; i++) 
     { 
      if (data[i].Equals(default(T))) 
      { 
       data[i] = value; 
       return; 
      } 
     } 
     T[] tmp = new T[data.Length + 10]; 
     data.CopyTo(tmp, 0); 
     Add(value); 
    } 

私はこのようなデータを追加します。

class Program 
{ 
    static void Main(string[] args) 
    { 
     MyArray<string> StringArray = new MyArray<string>(); 

     StringArray.Add("ONE"); 
     StringArray.Add("TWO"); 
    } 
} 
+3

理由をデフォルトに比較します( T)?あなたが持っている人の数を追跡してみませんか?または...単に 'リスト'を使用してください... –

+0

誰もがとても速いです:)私は誰もが示唆したように、コードとそのあなたのforループについてデバッグしました。新しいT [10]ではTの配列がありますが、配列[0]はnullです。まだ何も追加していないからです。 – adt

答えて

0

if (data[i].Equals(default(T)))が問題の原因です。新しい文字列(または任意の他の参照型)配列に

var array = new String[10]; 

アレイ内の各要素は、デフォルトでnullあります。あなたは

data[i].Equals(default(T) 

data[i]nullであると言うときに、あなたは、このように例外がスローされる原因と、null参照のメソッドを呼び出しています。

値の型に関係なく、配列がデフォルト値に初期化されるため、これは値型に対しては発生しません。

これはジェネリックの問題の一部です。参照型と値型を常に同じに扱うことはできません。

defaultを避けるために、代わりにこれを試してみてください:

private int _currentIndex = 0; 
public void Add(T value) 
{ 
    data[_currentIndex] = value; 
    _currentIndex++; 
    if(_currentIndex == data.Length) 
    { 
     T[] tmp = new T[data.Length + 10]; 
     data.CopyTo(tmp, 0); 
     data = tmp; 
     _currentIndex = 0; 
    }   
} 
+0

[等しい]はここで問題ではありません - [msdn](http://msdn.microsoft.com/en-us/library/bsc2ak47.aspx)によれば、「等しい」はまったく投げてはならない)。 – Femaref

+0

@Fem申し訳ありませんが、私は明確ではありませんでした。私の編集が理にかなってほしい。 – Will

+0

はあなたに向かって攻撃するものではありませんでしたが、私は最初にそれに落ちました。私のテキストはあまりにもあいまいでありました。とにかくインデックスカウンタを使用する方が良いです。 – Femaref

3

そのままstringdefaultnullです参照型であり、値型ではありません。配列T[]の新しい配列を作成しています。この配列のデフォルト値はT(この場合はnull)です。

data[i].Equals(default(T))は、null.Equals(...)を呼び出すときにNREをスローします。

1

あなたはこのラインでNREを取得しているので、あなたの配列は、NULL値で初期化されている:

if (data[i].Equals(default(T)))