1

コレクション ライブラリを構築していますが、すべてのジェネリック コレクション インターフェイスでクラス型が必要になり、それらを実装するすべてのコレクションが任意の型である必要があります。したがって、値型では、コレクションには値型用とボックス化用の 2 つのメソッドがあります。これは可能ですか?

このような:

interface ICollection<ItemType> where ItemType : class
{
    void DoSomething(ItemType item);
}

class Collection<ItemType> : ICollection<ItemType>
{
    void DoSomething(Object item);
    void DoSomething(ItemType item);
}

それを回避するための最良の方法は何でしょうか? インターフェイスは非ジェネリックですか?

4

2 に答える 2

3

この線:

ICollection<Object> s = new Collection<String>();

(コメント)out分散で動作します。ただし、分散DoSomething(ItemType)が必要になります。inその型はどちらinでもありませんout:分散はここでは適用されません

通常、これを処理する方法は、汎用 API非汎用 API を使用することです。特定のタイプに関心のある人は、汎用 API を使用できます。「オブジェクト」にのみ興味がある人は、非汎用 API を使用できます。

説明のために:

interface ICollection
{
    void DoSomething(object item);
}
interface ICollection<ItemType> : ICollection
{
    void DoSomething(ItemType item);
}

class Collection<ItemType> : ICollection<ItemType>
{
    void ICollection.DoSomething(Object item)
    {
        DoSomething((ItemType)item);
    }
    public void DoSomething(ItemType item)
    {
        //...
    }
}

次に、これは機能します:

ICollection s = new Collection<String>();
object o = "abcd";
s.DoSomething(o);
于 2013-01-10T07:47:44.037 に答える
0

値の型は常に type としてボックス化されobjectます。これは、ボックス化された値型のコレクションを強制的に a にしますがCollection<object>、これは実際にはタイプセーフではありません (たとえば、 a を追加することを誰も妨げませんstring)。ただし、型の安全性は、ジェネリック型の最大の利点の 1 つになることを意図しています。したがってclass、可能であれば、制約を削除することをお勧めします。

ところで: これらのジェネリック インターフェイスを (class制約なしで) 非ジェネリック バージョンに割り当てることができます。
IList l = new List<int>();

于 2013-01-10T07:48:43.570 に答える