泛型Cell类排序问题:ToArray()引发InvalidCastException异常原因
异常原因分析
核心原因:泛型类型的不变性
C#中默认的泛型类是不变的——哪怕string是object的子类,Cell<string>和Cell<object>也是完全独立的类型,无法直接互相强制转换。你的代码里试图把RowData中实际存在的Cell<string>或Cell<int>实例强转为Cell<object>,这本身就是不合法的类型转换操作。
延迟执行导致异常时机差异
results1是LINQ的延迟查询对象,此时仅构建了查询逻辑,并未实际遍历数据执行类型转换,所以不会立刻触发异常;results2调用ToArray()时,会触发LINQ查询的实际执行,程序此时尝试对每个元素执行(Cell<object>)强制转换,类型不匹配的问题直接暴露,抛出InvalidCastException。
额外说明
你的Cell<T>实现了IComparable<Cell<T>>接口,但该接口是针对具体泛型参数T设计的,仅支持相同T类型的Cell实例比较,这也意味着跨T类型的强制转换比较逻辑本身就不符合类的设计预期。
内容的提问来源于stack exchange,提问作者Amir Rezaei
相关产品推荐
相关产品推荐

