gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:05:41 25 4
gpt4 key购买 nike

我在 C# 中遇到多态性问题。我有一个实现接口(interface)的对象,但是我不能将对象的集合表示为接口(interface)的集合。这与我对多态性的理解背道而驰。所以我想知道我哪里出错了。

[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; }
}

最佳答案

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

如果一个 List-of-Foo 也是一个 IList-of-IBar,那么下面的代码会起作用:

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

然后我们在 Foo 的列表中添加了一个 Another。这是一个错误。编译器阻止了你犯错误。

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

关于c# - 多态性——我没有得到什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17773513/

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