我可以在同一个构造函数中使用泛型类和结构吗?

时间:2013-09-09 12:30:33

标签: c# generics

我对ServiceResponse对象的渴望是我想要回馈他们要求的“东西”。这可能是一个Foo列表,只是一个Foo或几乎任何东西,只要它是一个带有无参数构造函数的类。但是,有时候我想返回一个字节数组(byte []),这是不允许的,因为它是一个结构,显然没有无参数构造函数。

public class ServiceResponse<T> : ServiceResponse where T : new() {

    [DataMember]
    public T Result { get; set; }

    public ServiceResponse() {
        this.WasSuccessful = false;
        this.Result = new T();
        this.Exceptions = new List<CountyException>(); ;
    }

    public ServiceResponse(bool wasSuccessful, List<CountyException> exceptions, T result) {
        this.Result = result;
        this.WasSuccessful = wasSuccessful;
        this.Exceptions = exceptions;
    }
}

如果我将声明行调整为以下内容:

public class ServiceResponse<T> : ServiceResponse where T : new(), struct {

我收到以下错误:

  

byte []必须是具有公共无参数构造函数的非抽象类型,以便在泛型类型方法ServiceResponse

中将其用作参数T.

所以问题是,我可以使用一个类,它是一个泛型或结构的T吗?即使我必须看到它出现的类型,我想也没关系。

2 个答案:

答案 0 :(得分:7)

问题不在于struct。实际上,byte[]是引用类型(提示:数组)。问题是,byte[]没有公共无参数构造函数,就像错误消息告诉你一样

答案 1 :(得分:6)

摆脱new()约束。就涉及C#而言,所有结构都有一个无参数构造函数,因此您仍然可以使用new T()where T : struct的约束。

但请注意,byte[] 不是值类型,因此不会满足该约束。

你有什么理由不想让它不受约束而不打扰在构造函数中设置Result? (如果你真的想要,可以将它设置为default(T)。)