当结构是在 C# 中转换的通用对象的协变类型时,结构无法转换为对象的任何解决方法?
Any workarounds for structs failing to cast to object when the struct is the covariant type of a generic object being being casted in C#?
假设我用 struct
的协变类型参数实例化一个泛型 class,然后我将新创建的对象作为其自身使用类型参数 object
struct
的位置,尽管方差应该允许,但转换将失败。
示例:
public class Succeeds {}
public struct Fails {}
var castSucceeds = (IEnumerable<object>)Enumerable.Empty<Succeeds>();
var castFails = (IEnumerable<object>)Enumerable.Empty<Fails>();
正如您从上面看到的那样,由于 IEnumerable<T>
的通用类型是协变的,所以此转换有效,但是当尝试使用 struct
而不是 class
时,它会失败。我怀疑失败与将结构转换为对象时需要装箱有关。
有什么办法解决这个问题,还是我看错了?
根据Microsoft:
Variance applies only to reference types; if you specify a value type
for a variant type parameter, that type parameter is invariant for the
resulting constructed type.
尝试进行手动投射:
var castFails = Enumerable.Empty<Fails>().Cast<object>();
假设我用 struct
的协变类型参数实例化一个泛型 class,然后我将新创建的对象作为其自身使用类型参数 object
struct
的位置,尽管方差应该允许,但转换将失败。
示例:
public class Succeeds {}
public struct Fails {}
var castSucceeds = (IEnumerable<object>)Enumerable.Empty<Succeeds>();
var castFails = (IEnumerable<object>)Enumerable.Empty<Fails>();
正如您从上面看到的那样,由于 IEnumerable<T>
的通用类型是协变的,所以此转换有效,但是当尝试使用 struct
而不是 class
时,它会失败。我怀疑失败与将结构转换为对象时需要装箱有关。
有什么办法解决这个问题,还是我看错了?
根据Microsoft:
Variance applies only to reference types; if you specify a value type for a variant type parameter, that type parameter is invariant for the resulting constructed type.
尝试进行手动投射:
var castFails = Enumerable.Empty<Fails>().Cast<object>();