设置如下:
interface IFruit { }
interface IApple : IFruit { }
interface IBag<out T> { }
// This works
IBag<IFruit> ConvertBag(IBag<IApple> fruits) => fruits;
// Error: Cannot implicitly convert IBag<F> to IBag<IFruit>
IBag<IFruit> ConvertBag<F>(IBag<F> fruits) where F : IFruit => fruits;
正如预期的那样,我可以将
IBag<IApple>
转换为 IBag<IFruit>
。
但是,如果我知道 IBag<F>
是 IBag<IFruit>
,为什么我不能将 F
转换为 IFruit
?
但是,如果我知道
是IBag<F>
,为什么我不能将IBag<IFruit>
转换为F
?IFruit
因为
F
可能是一种值类型,而方差对于值类型实际上“不起作用”。 (例如,您不能将 IEnumerable<int>
分配给 IEnumerable<object>
类型的变量。)
如果将
F
限制为引用类型,则它有效:
IBag<IFruit> ConvertBag<F>(IBag<F> fruits) where F : class => fruits;