如何获取`ReadOnlyArray<InputDevice>?`类型变量的首个数组元素
解决方案
报错根因
- 直接写
test[0]报错:ReadOnlyArray<InputDevice>?是可空值类型,索引器属于内部封装的ReadOnlyArray<InputDevice>实例,必须先拆包拿到实际数组实例才能使用索引操作。 - 写
test.GetValueOrDefault()[0]报越界:当可空对象为null时,GetValueOrDefault会返回默认构造的空ReadOnlyArray实例,它的长度为0,访问索引0自然触发参数越界;就算可空对象有值,也存在数组本身为空的可能,直接访问索引同样会报错。
正确写法
写法1 无额外依赖(推荐)
不需要引入其他命名空间,兼容所有C#版本:
InputDevice firstDevice = null; // 先判断可空对象是否有值,再判断数组内是否存在元素 if (test.HasValue && test.Value.Count > 0) { firstDevice = test.Value[0]; } // 后续使用firstDevice前先判空即可
如果项目使用C# 8及以上版本,还可以用空条件运算符简化:
// test为null时直接返回null,不会触发空引用异常 // 注意:该写法仍需保证数组非空,否则还是会触发越界异常 InputDevice? firstDevice = test?[0];
写法2 用Linq简化代码
需要先引入System.Linq命名空间:
using System.Linq; // 空值或者数组为空时都返回null,无需额外写判断逻辑 InputDevice firstDevice = test.HasValue ? test.Value.FirstOrDefault() : null;
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

