我对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吗?即使我必须看到它出现的类型,我想也没关系。
答案 0 :(得分:7)
问题不在于struct
。实际上,byte[]
是引用类型(提示:数组)。问题是,byte[]
没有公共无参数构造函数,就像错误消息告诉你一样
答案 1 :(得分:6)
摆脱new()
约束。就涉及C#而言,所有结构都有一个无参数构造函数,因此您仍然可以使用new T()
但where T : struct
的约束。
但请注意,byte[]
不是值类型,因此不会满足该约束。
你有什么理由不想让它不受约束而不打扰在构造函数中设置Result
? (如果你真的想要,可以将它设置为default(T)
。)