C#接口和通用组合.想要返回<T>而不是其基本接口

Ark*_*nam 8 .net c# generics interface

用我认为是一段非常简单的代码来踩我自己的脚趾.代码说的比文字更好,所以在这里.

public interface IResponse
{
    IResult Result { get; set; }
}

public class Response<T> : IResponse
    where T : IResult
{
    public T Result { get; set; } 
    // COMPILER ERROR: Property 'Result' cannot be implemented property from interface 'IResponse'. Type should be 'IResult'.
}
Run Code Online (Sandbox Code Playgroud)

编译器不允许我这样做,因为IResponse要求Result为IResult,但是我想利用实现类中的泛型并强烈地将结果输入到T.这是不可能的,还是我错过了一些微不足道的东西?

Pie*_*kel 12

他们你也必须制作IResponse通用的:

public interface IResponse<T>
    where T : IResult
{
    T Result { get; set; }
}

public class Response<T> : IResponse<T>
    where T : IResult
{
    public T Result { get; set; } 
}
Run Code Online (Sandbox Code Playgroud)

如果你想在IResponse没有通用参数的情况下保持界面,你可以更加高兴.下面有两个接口,其中类透明地实现了没有泛型参数的接口:

public interface IResponse
{
    IResult Result { get; set; }
}

public interface IResponse<T> : IResponse
    where T : IResult
{
    T Result { get; set; }
}

public class Response<T> : IResponse<T>
    where T : IResult
{
    public T Result { get; set; } 

    IResult IResponse.Result
    {
        get { return Result; }
        set { Result = (T)value; }
    }
}
Run Code Online (Sandbox Code Playgroud)

而且,如果您希望更接近原始实现,可以删除IResponse<T>并获取以下内容:

public interface IResponse
{
    IResult Result { get; set; }
}

public class Response<T> : IResponse
    where T : IResult
{
    public T Result { get; set; } 

    IResult IResponse.Result
    {
        get { return Result; }
        set { Result = (T)value; }
    }
}
Run Code Online (Sandbox Code Playgroud)