2016-04-01 12 views
1

私自身のコレクションを作成しようとしています。もちろん、一般的な値が含まれています。配列の値がの_contentであるかどうかをチェックしようとしているとき、それはうまく動作しますが、ユーザーが整数を使用しない場合にのみ有効です。ジェネリックが0であることを確認してください

if (_content[_size - 1] != null) 

ポイントは、ユーザーが整数のコレクションを作成でき、配列よりもすべての値を0として初期化することです。だから私は値が0であるかどうかをチェックしようとしているとき - それはコンパイルされません。

if (_content[_size - 1] != 0) 

(コレクションが整数で構成されている場合)具体的に、この方法を動作しません:

public void Add(T item) 
{ 
     if (_content[_size - 1] != null) 
      throw new ArgumentOutOfRangeException("The Array is full"); 
     if (_size > 0) 
     { 
      for (int i = 0; i <= _size; i++) 
      { 
       if (_content[i] == null) 
       { 
        _content[i] = item; 
        break; 
       } 
      } 
     } 

} 
+0

?あなたは組み込みのもので簡単に扱うことができるかもしれません。 – zimdanen

+1

あなたは 'default(T)'を探していますか? – Jonesopolis

+0

追加が機能しません。私は説明にそれを追加しました。 –

答えて

1

あなたはジェネリック型にdefaultキーワードを使用することができ、それは、その型のデフォルト値を返します(つまり、参照型の場合はnull、値型の場合は0またはfalseなど)。

編集:前の例:-)

をクラッシュしていましたので、試してみてください。

!object.Equals(_content[_size - 1], default(T)) 

はあまりにも別の解決策のためのコメントを参照してください。

1

あなたはすなわちnullクラスのため、値がその型のデフォルト値に等しいかどうかをチェックするためにdefaultキーワードを使用することができ、数値の0など

また==オペレータISN」としてObject.Equals(a,b)またはEqualityComparer<T>.Default.Equals()を使用する必要がありますクラスTで使用できることが保証されているため、コンパイルされません。

だからあなたの方法のようなものになります:あなたはnullをチェック取得している問題は、その値の型(構造体、整数ETCS)である

public void Add(T item) 
{ 
    if (!EqualityComparer<T>.Default.Equals(_content[_size - 1], default (T))) 
     throw new ArgumentOutOfRangeException("The Array is full"); 
    if (_size > 0) 
    { 
     for (int i = 0; i <= _size; i++) 
     { 
      if (EqualityComparer<T>.Default.Equals(_content[i], default (T))) 
      { 
       _content[i] = item; 
       break; 
      } 
     } 
    } 
} 
0

がnullと比較することはできません。

ここではいくつかのアプローチをとることができます。 1つは、ジェネリックコレクションクラスで使用できる型を制約することです。このようにして、null可能な型(つまり参照型)のみがコレクションの型定義として使用されるようにすることができます。

public class MyCollection<T> where T : class

またはタイプはnullにそれを比較する前に、参照型である場合には、リフレクションを使用して、チェックすることができます。

typeof(T).IsValueType

特定の種類をチェックしないでください - あなたの問題はここにありますヌル以外の型とnullを比較していることを示します。

7

あなたがしようとしていることは悪い練習です。しないでください。

あなたのアプローチは、「無」を表すために1つの値、つまりゼロを予約します。ただし、ゼロと無差別に違いがあるため、ゼロが正当な値である場合にはエラーが発生します。

あなたのコレクションのユーザーが最後の数字にゼロを追加した場合に起こることを考えてください。あなたのコードは、セルが空であると考えて、例外をスローしないようにします。

より良い方法は、コレクションに設定されている実際の要素数を_sizeフィールドに格納することです。 _contentの最後の要素は、便利_content.Length-1に位置していますので、次のようにチェックが行われることができる:あなたはあなたの新しいコレクションでやろうとしている

if (_content.Length == _size) { 
    // InvalidOperationException is more appropriate here, 
    // because the error is caused by the state of your collection, 
    // rather than any particular argument passed to the method. 
    throw new InvalidOperationException("The Array is full"); 
} 
関連する問題