c# - 当结构是在 C# 中转换的通用对象的协变类型时,结构无法转换为对象的任何解决方法?
问题描述
假设我使用协变类型参数 a 实例化一个泛型类struct
,然后我将新创建的对象转换为自身,并使用类型参数object
代替struct
,尽管方差应该允许,但转换将失败。
例子:
public class Succeeds {}
public struct Fails {}
var castSucceeds = (IEnumerable<object>)Enumerable.Empty<Succeeds>();
var castFails = (IEnumerable<object>)Enumerable.Empty<Fails>();
正如你从上面看到的那样,由于IEnumerable<T>
协变的泛型类型,这种强制转换有效,但是当尝试使用 astruct
而不是 aclass
时,它会失败。我怀疑失败与将结构转换为对象时需要装箱有关。
有什么办法可以解决这个问题,还是我看错了?
解决方案
根据微软:
差异仅适用于引用类型;如果为变体类型参数指定值类型,则该类型参数对于生成的构造类型是不变的。
尝试进行手动转换:
var castFails = Enumerable.Empty<Fails>().Cast<object>();
推荐阅读
- java - Comparator.comparing 中的多项检查
- html - 使用严格排序的 grid/flex 填充垂直空白
- bouncycastle - 尝试将 Bouncy Castle 生成的密钥放入 AndroidKeyStore 时出现“不支持的密钥算法:ECDSA”
- node.js - Express:使用声明合并扩展 request.query 会引发 TypeScript 错误
- assembly - 错误的库在手动生成的 PE 64 位可执行文件中加载了错误的函数
- php - 服务器端处理问题 Class SSP not found
- netty - gPRC java:'流的窗口大小溢出:0'
- go - 使用接口时将结构传递给函数?
- css - 引导页脚输入组未拉伸以适合页面
- python - NameError:在另一个文件中定义 python 函数时,未定义名称“lite”