C# 中的协方差问题

问题描述 投票:0回答:1

设置如下:

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

c# generics covariance
1个回答
0
投票

但是,如果我知道

IBag<F>
IBag<IFruit>
,为什么我不能将
F
转换为
IFruit

因为

F
可能是一种值类型,而方差对于值类型实际上“不起作用”。 (例如,您不能将
IEnumerable<int>
分配给
IEnumerable<object>
类型的变量。)

如果将

F
限制为引用类型,则它有效:

IBag<IFruit> ConvertBag<F>(IBag<F> fruits) where F : class => fruits;
© www.soinside.com 2019 - 2024. All rights reserved.