gpt4 book ai didi

c# - 具有继承性的匿名类型列表

转载 作者:行者123 更新时间:2023-11-30 18:54:35 24 4
gpt4 key购买 nike

假设我有以下类(class)

public class Dog{}
public class Bulldog : Dog{}
public class Pitbull : Dog{}

我正在尝试创建这样的列表

var dogs2 = new[]
{
new { X = new Bulldog(), Y = 10},
new { X = new Pitbull(), Y = 20}
}.ToList();

但是,我收到以下错误 No best type found for implicitly - typed array
好的,我想这是有道理的。系统无法识别 X is a type of狗`

所以,我试着这样做

var dogs1 = Enumerable.Empty<object>()
.Select(x => new { X = new Dog (), Y = 0 })
.ToList();
dogs1.Add(new { X = new Pitbull(), Y = 10 });
dogs1.Add(new { X = new Bulldog(), Y = 10 });

现在,我收到此错误 cannot convert from '<anonymous type: PassingEvents.Bulldog X, int Y>' to '<anonymous type: PassingEvents.Dog X, int>' .为什么不能转换?不是 Bulldog可浇注到 Dog

有没有办法解决这个问题,而不必创建一个新类?下面的代码工作得很好

public class DogCombo
{
public Dog X;
public int Y;
}

var dogs3 = new[]
{
new DogCombo{ X = new Bulldog(), Y = 10},
new DogCombo{ X = new Pitbull(), Y = 20}
}.ToList();

最佳答案

Why can't it convert? Isn't Bulldog castable to Dog?

Bulldog 可以转换为 Dog,是的。

你的推理如下:

  • 斗牛犬可以变成狗
  • 因此 anonymous-type-with-Bulldog 应该可以转换为 anonymous-type-with-Dog。

这种推理——基础类型的属性应该暗示转换下的类型的属性——称为协方差

C# 在某些受限情况下支持协变。它们是:

  • Bulldog 的数组可以用作 Dog 的数组。请注意,这是不安全的协方差,因为您可以将 Poodle 放入 Dog 数组中,但不能放入 Bulldog 数组中。仅当您从不写入数组时,数组协方差才是安全的。

  • IEnumerable<Bulldog>可以转换为 IEnumerable<Dog> .这是安全的。斗牛犬的序列是狗的序列。其他一些泛型也是如此,比如 IEnumerator<T> .

  • 返回 Bulldog 的方法可以转换为返回 Dog 的委托(delegate)类型的委托(delegate)。

在某些情况下,C# 还支持逆变。例如,IComparable<Dog>可以转换为 IComparable<Bulldog> .可以与狗相提并论的事物也可以与斗牛犬相提并论。请注意,这种可转换性是朝着相反的方向发展的,因此是contra变体。

C# 支持结构匿名类型 的任何协变(或逆变)。

理论上,C# 可以根据需要支持匿名类型的逆变;这样做是安全的。语言和运行时团队之前已经介绍过此功能。这只是语言和运行时团队没有足够高地优先考虑功能以实际实现它的情况。

如果您认为有充分的理由在匿名类型等结构类型上实现协变转换,您可以在 Roslyn github 论坛上开始讨论该主题,也许有一天它会实现。

Is there a way to fix this, without having to create a new class?

我建议您创建一个新类。但是,如果您想要一种廉价且简单的解决方法:只需将显式转换为Dog即可。 .

关于c# - 具有继承性的匿名类型列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39860540/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com