PBG*_*PBG 2 c# anonymous-types
假设我有以下课程
public class Dog{}
public class Bulldog : Dog{}
public class Pitbull : Dog{}
Run Code Online (Sandbox Code Playgroud)
我正在尝试创建这样的列表
var dogs2 = new[]
{
new { X = new Bulldog(), Y = 10},
new { X = new Pitbull(), Y = 20}
}.ToList();
Run Code Online (Sandbox Code Playgroud)
但是,我收到以下错误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 });
Run Code Online (Sandbox Code Playgroud)
现在,我收到了这个错误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();
Run Code Online (Sandbox Code Playgroud)
您可以显式地将X转换为以下类型Dog:
var dogs2 = new[]
{
new { X = (Dog)new Bulldog(), Y = 10},
new { X = (Dog)new Pitbull(), Y = 20}
}.ToList();
Run Code Online (Sandbox Code Playgroud)
为什么不能转换?不是斗牛犬可以施加给狗吗?
斗牛犬可以兑换成狗,是的.
你的推理如下:
这种推理 - 底层类型的属性应该意味着转换下类型的属性 - 称为协方差.
C#在某些受限情况下支持协方差.他们是:
Bulldog数组可以用作Dog的数组.请注意,这是不安全的协方差,因为您可以将Poodle放入Dog数组中,但不能放入Bulldog数组中.如果您从不写入数组,则数组协方差才是安全的.
一个IEnumerable<Bulldog>可转化成IEnumerable<Dog>.这很安全.一系列斗牛犬是一系列狗.对于其他一些通用类型也是如此IEnumerator<T>.
返回Bulldog的方法可以转换为返回Dog的委托类型的委托.
在某些情况下,C#也支持逆变.例如,a IComparable<Dog>可以转换为IComparable<Bulldog>.可以比较狗的东西可以比较斗牛犬.请注意,这种可兑换性是相反的方向,因此是相反的变体.
C#也不会支持任何协方差(或逆变)类,结构或匿名类型.
从理论上讲,C#可以根据需要支持匿名类型的逆变; 这样做是安全的.之前语言和运行时团队已经投入了这个功能.简单来说,语言和运行时团队没有对该功能进行高度优先级的实际实现.
如果你认为有很好的理由在像匿名类型这样的结构类型上实现协变转换,你可以在Roslyn github论坛上开始讨论该主题,也许有一天它会实现.
有没有办法解决这个问题,而无需创建新类?
我建议你创建一个新类.但是如果你想要一个便宜而简单的解决方法:只需要明确地转换为Dog.
| 归档时间: |
|
| 查看次数: |
221 次 |
| 最近记录: |