多态性-我没有得到什么?

贝内齐

我在C#中遇到多态性问题。我有一个实现接口的对象,但是我不能将对象的集合表示为接口的集合。面对我对多态性的理解,这真是天壤之别。所以我想知道哪里出了问题。

[TestFixture]
class Tester
{
    [Test]
    public void Polymorphism()
    {
        var list = new List<Foo> {new Foo {Name = "Item"}};

        Assert.That(list, Is.InstanceOf<IList>());
        Assert.That(list[0], Is.InstanceOf<Foo>());
        Assert.That(list[0], Is.InstanceOf<IBar>());

        // why are the rest true but this false?
        Assert.That(list, Is.InstanceOf<IList<IBar>>());
    }
}

internal interface IBar
{
}

internal class Foo : IBar
{
    public string Name { get; set; }
}
马克·格雷维尔(Marc Gravell)

这是一个方差问题,而不是多态性。

如果Foo列表也是IBar的IList,则可以进行以下操作:

class Another : IBar {}
IList<IBar> list = new List<Foo>();
list.Add(new Another());

然后,我们将另一个添加到Foo列表中。这是一个错误。编译器阻止您犯错。

请注意,最新的编译器/.net版本通过“ in” /“ out”支持差异。因此,作为IBar的IEnumerable-IBar可以很好地使用List-of-Foo。因为保证只返回Foo(不接受它们),并且所有Foo都是IBar,所以很安全。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

什么是Levity多态性

来自分类Dev

DS.RESTAdapter假设没有多态性

来自分类Dev

如何调用没有多态性的虚方法?

来自分类Dev

DS.RESTAdapter假设没有多态性

来自分类Dev

C ++中的多态性和我的考试

来自分类Dev

C ++中静态多态性背后的动机是什么?

来自分类Dev

为什么这种C ++多态性不起作用?

来自分类Dev

为什么Haskell(GHC)中的多态性如此昂贵?

来自分类Dev

多态性:被调用方法的真正类型是什么?

来自分类Dev

OOP中需要多态性是什么?

来自分类Dev

C ++中静态多态性背后的动机是什么?

来自分类Dev

C ++多态性。为什么这样运作?

来自分类Dev

OOP中需要多态性是什么?

来自分类Dev

Purescript行多态性。正确的语法是什么?

来自分类Dev

为什么多态性不起作用?

来自分类Dev

具有可选IBOutlet的属性多态性

来自分类Dev

具有多态性的C ++复制指针的向量

来自分类Dev

使用具有多态性的通用接口

来自分类Dev

接口为类型的数组(具有接口的多态性)

来自分类Dev

具有final或模板的静态多态性?

来自分类Dev

C ++:运算符=具有多态性的重载

来自分类Dev

接口为类型的数组(具有接口的多态性)

来自分类Dev

具有多态性的C#泛型

来自分类Dev

Haskell 返回具有类限制的类型多态性

来自分类Dev

Rails 5 命名范围具有多态性,UndefinedColumn

来自分类Dev

具有不同模板类型的子类的多态性

来自分类Dev

条件对C ++中的多态对象有什么作用?(包含多态性)

来自分类Dev

C ++ std容器-没有指针的多态性。是否有可能?

来自分类Dev

C ++多态性错误:没有匹配的函数来调用