首页 / C# / 在C#中进行适当的可空类型检查?
在C#中进行适当的可空类型检查?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了在C#中进行适当的可空类型检查?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2189字,纯文字阅读大概需要4分钟。
内容图文
![在C#中进行适当的可空类型检查?](/upload/InfoBanner/zyjiaocheng/806/1466892c4be8467394bf9c80412762ea.jpg)
好吧,我的实际问题是:我正在实现一个IList< T>.当我得到CopyTo(数组数组,int索引)时,这是我的解决方案:
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.检查设置为null的变量时,is关键字始终返回false.现在,由于种种原因,包括避免空取消引用等,这很方便.我最终想出的类型检查是:
try
{
T test = (T)array.GetValue(0);
}
catch (InvalidCastException ex)
{
throw new ArgumentException("Cannot cast to this type of Array.", ex);
}
这不是很优雅,但它有效……有没有更好的方法呢?
解决方法:
唯一可以肯定的方法是使用反射,但是通过使用数组可以避免成本的90%是T [].大多数人都会传入一个正确类型的数组,所以这样做.但是,您应该始终提供代码来进行反射检查,以防万一.这是我的一般样板材的样子(注意:我在这里写的,从内存中写的,所以这可能不会编译,但它应该给出基本的想法):
class MyCollection : ICollection<T> {
void ICollection<T>.CopyTo(T[] array, int index) {
// Bounds checking, etc here.
CopyToImpl(array, index);
}
void ICollection.CopyTo(Array array, int index) {
// Bounds checking, etc here.
if (array is T[]) { // quick, avoids reflection, but only works if array is typed as exactly T[]
CopyToImpl((T[])localArray, index);
} else {
Type elementType = array.GetType().GetElementType();
if (!elementType.IsAssignableFrom(typeof(T)) && !typeof(T).IsAssignableFrom(elementType)) {
throw new Exception();
}
CopyToImpl((object[])array, index);
}
}
private void CopyToImpl(object[] array, int index) {
// array will always have a valid type by this point, and the bounds will be checked
// Handle the copying here
}
}
编辑:好的,忘记指出一些事情.一对夫妇回答天真地使用了什么,在这段代码中,只读取了元素.IsAssignableFrom(typeof(T)).如果开发人员知道此特定ICollection中的所有值实际上是从T派生的类型S,并且传递类型S的数组,则还应该允许typeof(T).IsAssignableFrom(elementType),如BCL所做的那样. []
内容总结
以上是互联网集市为您收集整理的在C#中进行适当的可空类型检查?全部内容,希望文章能够帮你解决在C#中进行适当的可空类型检查?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。