为何IReadOnlyList可接受实现类返回值,IReadOnlyDictionary却不行?
问题原因解析
这本质是C#泛型协变支持范围的差异导致的:
IReadOnlyList<T>是协变接口,它的定义里用out关键字标记了泛型参数T:public interface IReadOnlyList<out T> : IReadOnlyCollection<T>, IEnumerable<T>, IEnumerable协变允许你把
List<A>(具体实现类的泛型实例)隐式转换为IReadOnlyList<IA>(接口类型的泛型接口)——因为A是IA的实现类,协变支持这种"从派生类到基类/接口"的泛型转换。而
IReadOnlyDictionary<TKey, TValue>的泛型参数TValue是不变的,它的定义没有用out标记TValue:public interface IReadOnlyDictionary<TKey, TValue> : IEnumerable<KeyValuePair<TKey, TValue>>, IEnumerable不变意味着
Dictionary<Guid, A>和IReadOnlyDictionary<Guid, IA>之间不存在隐式转换关系,哪怕A实现了IA也不行。
如果要让Foo2正常返回,你可以手动转换字典里的每个值,比如:
public IReadOnlyDictionary<Guid, IA> Foo2 => new Dictionary<Guid, A>().ToDictionary(kv => kv.Key, kv => (IA)kv.Value);
或者直接创建Dictionary<Guid, IA>实例并添加A类型的元素,因为A可以隐式转换为IA。
内容的提问来源于stack exchange,提问作者null
相关产品推荐
相关产品推荐

