好的,我的实际问题是:我正在实施一个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);
}
这并不完全优雅,但它有效......有没有更好的方法?