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

本文关键字:泛型类 结构 构造函数 我可以 | 更新日期: 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)