次のシナリオに遭遇したとき、私は今日インターフェイスでいくつかの作業を行っていました。次の 2 つの単純なインターフェイスがあるとします。
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; }
}
}
1 つはキャストを必要とし、もう 1 つは必要としないのはなぜですか? どちらの場合でも返される両方のコレクションのオブジェクト型をチェックすると、両方が実際に を実装していることが確認されICollection
ます。
ここでは魔法の種類の変換が内部で行われていると思われるため、共変/反変と関係があるようですが、正確に何が起こっているのかはよくわかりません。