【问题标题】:Overload constructors with normal and generic parameters [duplicate]使用普通和泛型参数重载构造函数[重复]
【发布时间】:2018-04-14 01:26:55
【问题描述】:

我有一个带有两个构造函数的 Response 类。一个接收一个 Result 对象,另一个接收一个通用 Result 对象。

如何声明Response类的泛型构造函数来获取泛型对象?

在此示例代码中,使用了非泛型构造函数。

var result = new Result<SomeModel>();
var response = new Response(result); // should use the generic constructor but uses the normal

public interface IModel
{
}

public class SomeModel : IModel
{
    public string Text { get; set; }
}

public class Result<T> : Result where T : class, IModel
{
    public T Model { get; set; }
}

public class Result
{
    public bool Success { get; set; }
}

public class Response
{
    public Response(Result<IModel> data)
    {
    }

    public Response(Result data)
    {
    }
}

【问题讨论】:

  • 试试这个,看看为什么它不能编译的消息:new Response((Result&lt;IModel&gt;)result)——这是一个(co|contra)方差的东西。 Result&lt;SomeModel&gt; 不是 Result&lt;IModel&gt;

标签: c# generics constructor


【解决方案1】:

Result&lt;IModel&gt;Result&lt;SomeModel&gt; 不同。

您有两个选择:首先,您可以将Response 泛型为Response&lt;T&gt; where T : IModel,然后将构造函数更改为采用Result&lt;T&gt;

或者,您可以定义一个IResult&lt;out T&gt; 接口(由Result&lt;T&gt; 实现,只有一个模型属性的getter,并将Response 的构造函数更改为采用IResult&lt;IModel&gt;;这称为“协方差”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多