首页 > 解决方案 > 当结构是在 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时,它会失败。我怀疑失败与将结构转换为对象时需要装箱有关。

有什么办法可以解决这个问题,还是我看错了?

标签: c#genericsstructcastingcovariance

解决方案


根据微软

差异仅适用于引用类型;如果为变体类型参数指定值类型,则该类型参数对于生成的构造类型是不变的。

尝试进行手动转换:

var castFails = Enumerable.Empty<Fails>().Cast<object>();

推荐阅读