我是c#的新手,但对scala相对有经验,我正在尝试模仿scala的列表类(它由Cons和静态类Nil扩展)。我也希望得到它的类型行为,因为.NET从4.0开始就支持协变/逆变。请允许我展示我的意思:
Scala REPL:
class A
class B extends A
class C extends A
val x = new B() :: new B()
//this is type List[B]
val y = new C() :: new C()
//this is type List[C]
val z = new C() :: x
//This uses contravariance to figure out and infer that this is type List[A]!!!
在C#中,这将引发编译器错误,因为C和B与ImmutableList不是同一类型。
网上似乎没有例子,我仍然是C#的新手,所以我认为在盲目尝试之前问问C#是否可以做到这一点是明智的(我仍在尝试,但我也在学习其他语言)。
谢谢!
在C#中,这将引发编译器错误,因为C和B不是与ImmutableList类型相同。
在C#中,类不是共/反变量,它们是通过in
和out
关键字使用的接口和委托的属性。请记住,在C#中,List<T>
是一个可变列表,它不像Scala中的不可变List[T]
那样工作。
您可以做的是声明List<T>
:的基本类型
void Main()
{
var list = new List<A>();
list.Add(new B());
list.Add(new C());
}
class A { }
class B : A { }
class C : A { }
使用T
的接口也是如此,但您不能更进一步。这不会编译:
void Main()
{
var bs = new List<B>();
var cs = new List<C>();
var result = bs.Concat(cs);
}
有关更多信息,请参阅Why is';C#4.0中的类是否存在一般方差?