如何在C#中将ImmutableArray<DerivedClass>转换为ImmutablyArray<BaseClass>反之亦然?

How to cast ImmutableArray<DerivedClass> to ImmutablyArray<BaseClass> and vice versa in C#?

提问人:DomenPigeon 提问时间:8/16/2023 最后编辑:Peter CsalaDomenPigeon 更新时间:8/16/2023 访问量:58

问:

我知道不可能强制转换派生列表(为什么不在这里得到很好的解释),但是 ImmutableArrays 呢,因为它们不能被更改,强制转换应该是有效的,对吧?

我希望这能起作用:

class Animal {}
class Dog : Animal {}

ImmutableArray<Dog> dogs = ImmutableArray.Create<Dog>(new Dog());
ImmutableArray<Animal> animals = (ImmutableArray<Animal>) dogs;
ImmutableArray<Dog> dogsBack = (ImmutableArray<Dog>) animals;

C# 强制转换 不可变集合

评论

1赞 ChrisBD 8/16/2023
你为什么要这样做?您不能像包含实例一样访问或在创建时添加实例吗?dogsAnimalDoganimals
0赞 DomenPigeon 8/16/2023
@ChrisBD我需要它用于缓存方案,我在这里做了一个例子

答:

3赞 DomenPigeon 8/16/2023 #1

是的,这是可能的:

ImmutableArray<Dog> dogs = ImmutableArray.Create<Dog>(new Dog());
ImmutableArray<Animal> animals = ImmutableArray<Animal>.CastUp(dogs);
ImmutableArray<Dog> dogsBack = animals.CastArray<Dog>();

请注意,您还可以使用 CastArray 从狗转换为动物,但由于协方差,CastUp 比该方法快得多。CastArray

评论

1赞 Peter Csala 8/16/2023
为什么需要 ? 应该足够了吗?ImmutableArrayCastUpdogs.CastArray<Animal>()
3赞 Marc Gravell 8/16/2023
@PeterCsala这两种操作都只是将基础数组转换为零拷贝;“足够”表示差异 - 如果有的话,是可取的,因为它利用了已知的协方差运算,而不是使用类型测试的未知盲法;来源,对于好奇的人:github.com/tunnelvisionlabs/dotnet-collections/blob/master/......CastUp