我可以在同一构造函数中使用泛型类和结构吗?
本文关键字:泛型类 结构 构造函数 我可以 | 更新日期: 2023-09-27 18:30:37
我对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 的类是泛型还是结构吗? 即使我必须看看它进来时是什么类型,我想也没问题。
问题不在于struct
。实际上,byte[]
是一种引用类型(提示:数组)。问题是,byte[]
没有公共无参数构造函数,就像错误消息告诉您的那样
只需摆脱new()
约束即可。就 C# 而言,所有结构都具有无参数构造函数,因此您仍然可以使用new T()
,只需约束 where T : struct
。
但请注意,byte[]
不是值类型,因此它不满足该约束。
您不想让它不受约束而不费心在构造函数中设置Result
有什么原因吗?(或者,如果您确实愿意,请将其设置为 default(T)
。