协变和逆变一元类型 c# 中的 ala Scala 列表



我是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#中,类不是共/反变量,它们是通过inout关键字使用的接口和委托的属性。请记住,在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中的类是否存在一般方差?

相关内容

  • 没有找到相关文章

最新更新