0

我对 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 吗?即使我必须看看它是什么类型的,我想也可以。

4

2 回答 2

7

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

于 2013-09-09T12:35:12.860 回答
6

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

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

你有什么理由不想让它不受约束并且不想Result在构造函数中设置?(或者default(T)如果你真的想设置它。)

于 2013-09-09T12:33:27.123 回答