質問

と思いますかかいが少し恥ずかしいこのような質問ですが、やっぱることができません回答:

私のクラス List<T> るimplemetns IList.

public class List<T> : IList

に含まれはIlist

int Add(object value)

私は理解してい List<T> 必要に近づけないでくださる方法タイプの安全性にリソースをカスタマイズいます。がどのようになるのでしょうか?mustntクラスの実施の全体のス?

役に立ちましたか?

解決

この(インターフェイス)方法はそうだと思います 明示的に実装しました:

public class List<T> : IList
{
     int IList.Add( object value ) {this.Add((T)value);}
}

そうすることによって、 Add( object ) メソッドは非表示になります。あなたがキャストした場合、あなたはそれを呼ぶことができるだけです List<T> インスタンスに戻ります IList 実例。

他のヒント

リフレクターへの簡単な旅行は、ilist.addがこのように実装されていることを示しています。

int IList.Add(object item)
{
    ThrowHelper.IfNullAndNullsAreIllegalThenThrow<T>(item, ExceptionArgument.item);
    try
    {
        this.Add((T) item);
    }
    catch (InvalidCastException)
    {
        ThrowHelper.ThrowWrongValueTypeArgumentException(item, typeof(T));
    }
    return (this.Count - 1);
}

言い換えれば、実装はそれをキャストします t それを機能させ、失敗させるためにあなたは非渡します t 互換性のあるタイプイン。

List<T> 明示的に実装します IList.Add(object value) それが、それが通常は見えない理由です。以下を実行してテストできます。

IList list = new List<string>();
list.Add(new SqlDataReader()); // valid at compile time, will fail at runtime

明示的に実装するので、キャストする必要があります IList 最初にそれを使用します。

List<int> l = new List<int>();
IList il = (IList)l;
il.Add(something);

最初にリストインスタンスをインターフェイスにキャストすることを呼び出すことができます。

List<int> lst = new List<int>();
((IList)lst).Add("banana");

そして、あなたは同じように素敵な、ランタイム、argumentExceptionを得るでしょう。

フレデリックする権利 その List<T>'s"の実施 IList が明示的に特定の会員、特に脅威を与えるタイプ。

の実施彼と彼の答えできない権利はもちろん、以来るのではなく、コンパイル。

このような場合には、代表的なアプローチは勇め インタフェースを取得員が働きがいの場合は不可能である。

ことに注意 IList.Add 法定義を返す:

の位置に新しい 要素が挿入された、または-1 この商品ませんでした に挿入するものと期待される。

でも、完全に実施 このことにより

int IList.Add(object value)
{
    if (value is T)
    {
        Add((T)value);
        return Count - 1;
    }

    return -1;
}

これは単なる推測します。(だいかんを利用できることが リフレクタ.) です;例えば、これが投 NotSupportedException, ることが多いため不完全ンタフェースの実装など ReadOnlyCollection<T>'s"の実施 IList<T>.ただ、上記の文書の要件 IList.Add, 思くカバーすることができるので、本物さながらの出来上がり。●

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top