どのよう一覧<T> な実施Add(object value)?
-
10-10-2019 - |
質問
と思いますかかいが少し恥ずかしいこのような質問ですが、やっぱることができません回答:
私のクラス 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
, 思くカバーすることができるので、本物さながらの出来上がり。●