2

クラスは HashSet から継承し、 のEqualKeys(T x, T y)代わりにカスタム チェックを使用して一意のオブジェクトのセットを取得しますIEqualityComparer

public class UniqueSet<T> : HashSet<T> where T : IKey
{
    public new void Add(T item)
    {
         // .. check item for null, empty key etc.

          if (base.Any(t => UniqueSet<T>.EqualKeys(t, item)))
          {
             throw new ArgumentException(..);
          }
          if (!base.Add(item)) throw new ArgumentException(..);
     }

    private static bool EqualKeys(T x, T y) 
    {
       return ((IKey)x).Key.Equals(((IKey)y).Key, StringComparison.CurrentCultureIgnoreCase);
    }
}

base.Anyに置き換える必要があるため、コードはコンパイルされませんthis.Any
私はそれがなぜなのか理解できないのではないかと心配していますか?

4

2 に答える 2

13

"Any" は のメソッドではなく、拡張メソッドHashSet<T>です。基本型には存在しないため、基本型で明示的に呼び出すことはできません。「this.Any」で呼び出すと、オーバーロード解決コードは「this」の型で「Any」を見つけることができないため、拡張メソッドの検索を開始し、1 つを見つけます。

あなたの質問ではありませんが、とにかく言及します。そのような要素を既に持っているセットに追加する場合、なぜスローするのですか? そうすることをノーオペレーションにしないのはなぜですか?スローすることで、 Add の呼び出し元が要素が既にセットに含まれているかどうかを知る必要があります。これは面倒な要件のように思えます。

于 2010-10-01T15:34:20.423 に答える
1

HashSet<T>を実装していないためですAny()Any()からの拡張メソッドですIEnumerable<T>。base を使用する場合、拡張メソッドではなく基本型を明示的に参照しています。

于 2010-10-01T15:35:48.290 に答える