今天我正在使用接口做一些工作,当我遇到以下场景时。给定这两个简单的接口:
public interface IItem { }
public interface IInventory
{
ICollection<IItem> Items { get; }
}
我做了一个简单的类来实现IInventory
,并注意到这个实现就像写的那样完美:
public class BasicInventory1 : IInventory
{
private Dictionary<int, IItem> items;
public ICollection<IItem> Items
{
get { return items.Values; }
}
}
但是,此实现需要强制转换:
public class BasicInventory2 : IInventory
{
private Dictionary<int, IItem> items;
public ICollection<IItem> Items
{
get { return (ICollection<IItem>)items; }
}
}
为什么一个需要演员而另一个不需要?检查在任何一种情况下都返回的两个集合的对象类型确认它们实际上都实现了ICollection
.
我怀疑这里有一些神奇的类型转换,因此似乎与协/逆变有关,但我不太明白到底发生了什么。