C#接口和通用组合。想要返回<;T>;而不是它的基本接口

C#接口和通用组合。想要返回<;T>;而不是它的基本接口,c#,.net,generics,interface,C#,.net,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' cann

我用我认为非常简单的一段代码踩了自己的脚。代码比文字更能说明问题,就是这样

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'.
}
公共接口i响应
{
IResult结果{get;set;}
}
公开课回应:我回应
其中T:IResult
{
公共T结果{get;set;}
//编译器错误:无法从接口“IResponse”实现属性“Result”。类型应为“IResult”。
}

编译器不允许我这样做,因为IResponse要求结果为IResult,但是我想利用实现类中的泛型并将结果强键入T。这是不可能的,还是我遗漏了一些琐碎的东西?

他们也必须使
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; } 
}
而且,如果您想更接近原始实现,可以去掉
i响应
,并获得以下内容:

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; }
    }
}
公共接口i响应
{
IResult结果{get;set;}
}
公开课回应:我回应
其中T:IResult
{
公共T结果{get;set;}
IResult IResponse.Result
{
获取{返回结果;}
设置{Result=(T)值;}
}
}

您应该将IResponse设置为泛型,并将IResponse中的结果类型更改为传递到此接口的类型参数

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

public class Response<T> : IResponse<T>
{
    public T Result { get; set; } 
}
公共接口i响应,其中T:IResult
{
T结果{get;set;}
}
公开课回应:我回应
{
公共T结果{get;set;}
}
如果你“只是”想“利用泛型”,你不需要
i响应

接口正在解决另一个问题,一个与您的愿望不兼容的问题。考虑

IResponse r = x ? new Response<int>() : new Response<string>();
r.Result = ... // what type?
i响应r=x?新响应():新响应();
r、 结果=…/什么类型?
因此,要么使
i响应
也通用,要么将其全部删除

公共接口i响应,其中T:IResult
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; } 
    // NO MORE COMPILER ERROR
}
{ T结果{get;set;} } 公共类响应:IResponse,其中T:IResult { 公共T结果{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'. 

    IResult IResponse.Result
    {
        get { return this.Result; }
        set { this.Result = (T)value; }
    }
} 
公共类响应:i响应
其中T:IResult
{
公共T结果{get;set;}
//编译器错误:无法从接口“IResponse”实现属性“Result”。类型应为“IResult”。
IResult IResponse.Result
{
获取{返回this.Result;}
设置{this.Result=(T)值;}
}
} 

使接口也通用的问题是,我在另一个类中使用它,我不希望它强迫我指定T。是的,我想到了这一点。这就是为什么我刚刚添加了第二个和第三个选项。刚刚看到您的更新。看起来不错,我脑子里有什么东西。好东西!:)
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'. 

    IResult IResponse.Result
    {
        get { return this.Result; }
        set { this.Result = (T)value; }
    }
}