You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中如何实现ImmutableArray<派生类>与ImmutableArray<基类>互转?

为什么ImmutableArray无法直接强制转换为基类型的ImmutableArray?

你提到的强制转换确实无法直接运行,核心原因是ImmutableArray是值类型(struct),而.NET的泛型协变仅支持引用类型的接口和委托,值类型本身不具备协变能力——哪怕它是不可变的。

具体原因

普通可变集合(比如List)不能做协变转换,是因为转换后会破坏类型安全(比如往List里添加Cat,实际底层是List)。而ImmutableArray虽然解决了不可变带来的类型安全问题,但它的struct本质导致它无法利用.NET的协变机制:协变依赖于引用类型的引用兼容性,值类型的实例是直接存储在栈或结构体中的,无法像引用类型那样通过接口实现隐式转换。

正确的转换方式

ImmutableArray提供了高效的类型转换方法As<TTarget>(),它会在类型兼容的情况下共享内部数组(因为不可变,无需复制),几乎没有性能开销:

class Animal {}
class Dog : Animal {}

ImmutableArray<Dog> dogs = ImmutableArray.Create<Dog>(new Dog());
// 向上转换为ImmutableArray<Animal>
ImmutableArray<Animal> animals = dogs.As<Animal>();
// 向下转换,需确保类型安全(可通过IsOfType<T>()检查)
if (animals.IsOfType<Dog>())
{
    ImmutableArray<Dog> dogsBack = animals.As<Dog>();
}

如果你的环境不支持As<TTarget>(),也可以用ImmutableArray.CreateRange<TTarget>(dogs),同样能实现转换且共享内部数组。

内容的提问来源于stack exchange,提问作者DomenPigeon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 01:03:24