结果类型协方差 - 泛型类,方法返回接口类型和特定类型

时间:2017-10-09 14:04:10

标签: c# generics interface covariance

我有这两个接口:

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 个答案:

答案 0 :(得分:3)

由于:

IResult GetResult(string someId);

与:

不同
T GetResult(string id)

你告诉编译器约束T是实现IResult的任何类 - 而不是IResult。这两件事情是不一样的。