代码之家  ›  专栏  ›  技术社区  ›  Tarec

结果类型协方差-泛型类,方法同时返回接口类型和特定类型[重复]

  •  3
  • Tarec  · 技术社区  · 7 年前

    我有两个接口:

    public interface IResult
    {
        object SomeProperty {get;set;}
    }
    
    public interface IFooManager
    {
        IResult GetResult(string someId);
    }
    

    我想实施一个 IFooManager

    public class MyFooManager<T> : IFooManager where T: class, IResult
    {
        public T GetResult(string id)
        {
            return null; //the value doesn't really matter here
        }
    }
    

    但是,这会导致编译错误:

    Cannot implement method from interface [..].IFooManager. Return type should be [..].IResult

    现在,我知道我可以通过明确定义接口方法来解决这个问题,如下所示:

    IResult IFooManager.GetResult(string id)
    {
        return GetResult(id);
    }
    

    但问题是:为什么编译器不能理解它呢 T GetResult() 确实返回一个实现 IResult out T 最重要的是协方差界面,但我无法将其从脑海中抹去——为什么 T 类型限制不足以确保类型安全?

    1 回复  |  直到 7 年前
        1
  •  3
  •   marc_s HarisH Sharma    7 年前

    因为:

    IResult GetResult(string someId);
    

    不同于:

    T GetResult(string id)
    

    您使用约束告诉编译器T是任何实现的类 IResult -不是 IResult公司 . 这两件事是不一样的。