将泛型new()约束嵌入到接口/类中?

时间:2016-09-09 09:47:53

标签: c# generics

到目前为止,我一直在添加new()这样的约束。

public T Request<T>(BaseRequest request)
        where T : BaseResponse, new()

有没有办法将new()烘焙到BaseResponse,这样我只需要指定

        where T : BaseResponse

2 个答案:

答案 0 :(得分:1)

没有。派生类总是可以有一个私有/受保护的构造函数,并且没有办法阻止它。它甚至可能是一个抽象的类。

唯一的例外是struct,它总是有一个默认构造函数 - 你使用default(SomeStruct)得到的构造函数。不用说,这只是意味着用零初始化结构(尽管C#6使这有点复杂)。

答案 1 :(得分:1)

如果您的课程中有多种通用方法,那么您可以省去一些打字的唯一方法就是将改为通用,即从中获取:

class YourClass
{
    public static T Request<T>(BaseRequest request)
       where T : BaseResponse, new()
    { }

    public static T SomethingElse<T>(BaseRequest request)
       where T : BaseResponse, new()
    { }
}

到此:

class YourClass<T> where T : BaseResponse, new()
{
    public static T Request(BaseRequest request)
    { }

    public static T SomethingElse(BaseRequest request)
    { }
}