わかりました、私の実際の問題はこれでした:私はIList<T>
. に到達したときCopyTo(Array array, int index)
、これが私の解決策でした:
void ICollection.CopyTo(Array array, int index)
{
// Bounds checking, etc here.
if (!(array.GetValue(0) is T))
throw new ArgumentException("Cannot cast to this type of Array.");
// Handle copying here.
}
これは私の元のコードで機能し、引き続き機能します。しかし、それには小さな欠陥があり、テストの構築を開始するまで明らかにされませんでした。具体的には次のようなものです。
public void CopyToObjectArray()
{
ICollection coll = (ICollection)_list;
string[] testArray = new string[6];
coll.CopyTo(testArray, 2);
}
これで、このテストに合格するはずです。ArgumentException
キャストできないくらい投げます。なんで?array[0] == null
. に設定されている変数をチェックすると、is
キーワードは常に false を返しますnull
。これは、null デリファレンスの回避など、さまざまな理由で便利です。型チェックのために最終的に思いついたのは次のとおりです。
try
{
T test = (T)array.GetValue(0);
}
catch (InvalidCastException ex)
{
throw new ArgumentException("Cannot cast to this type of Array.", ex);
}
これは正確にはエレガントではありませんが、機能します...もっと良い方法はありますか?