You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 20:10:57