【问题标题】:Using Generic class with type String and getting error 'string' must be non-abstract type使用字符串类型的泛型类并获取错误“字符串”必须是非抽象类型
【发布时间】:2014-08-19 13:13:41
【问题描述】:

我有一个简单的泛型类如下:

public class DataResponse<T> where T : new()
{
public DataResponse()  
{
    this.Data = new List<T>();
    IsSuccessful = true;
}

public bool IsSuccessful { get; set; }
public string[] ErrorMessages { get; set; }
public List<T> Data { get; set; }
}

它适用于我使用的每种自定义类型,但是有一次我有一个字段的数据集合。我不会使用一个字段创建自定义类,而是创建类型字符串。但是这样做会返回错误:

var response = new DataResponse<String>();

'string' 必须是具有公共无参数构造函数的非抽象类型,才能将其用作泛型类型或方法 'DataResponse' 中的参数 'T'

更新 我添加了 where T : new() 以响应最初遇到的问题。删除它解决了它,因为它导致 IDE 突出显示实际上给我带来问题的正确行。导致错误的行是一个确实具有 new() 约束的方法。

显然这是对方法的完全不同的调用

【问题讨论】:

  • 为什么将 where T 设置为 new()?
  • 根据docsSystem.String not 有无参数构造函数。你在哪里看到的?
  • 类型字符串有一个无参数构造函数。不,它没有 - String Constructor
  • @Gandarez 我实际上已经添加了 T : new() 作为遇到错误并将其视为常见解决方案的结果。直到后来我才意识到 IDE 在错误的行上显示了错误。

标签: c# generics


【解决方案1】:

new 约束

where T : new()

需要类型 T 才能拥有公共默认构造函数:

new 约束指定泛型类声明中的任何类型参数都必须具有公共无参数构造函数。要使用新约束,类型不能是抽象的。

string 没有。

尝试从

中删除where T : new()
public class DataResponse<T> where T : new()

【讨论】:

    【解决方案2】:

    发生这种情况是因为字符串没有具有公共无参数构造函数,这是 :new() 所需的。你可以在这里确认String Class

    您应该将代码修改为:

    public class DataResponse<T>
    {
    public DataResponse()  
    {
        this.Data = new List<T>();
        IsSuccessful = true;
    }
    
    public bool IsSuccessful { get; set; }
    public string[] ErrorMessages { get; set; }
    public List<T> Data { get; set; }
    }
    

    【讨论】:

    • 这是 IDE 错误和我的“愚蠢”的组合。我在想“我总是在没有参数的情况下制作新字符串。”我总是向人们解释当他们开始连接它们时字符串是如何不可变的,在这里我自己在另一个例子中忘记了它。
    【解决方案3】:

    新约束指定泛型类声明中的任何类型参数都必须具有公共无参数构造函数。要使用新的约束,类型不能是抽象的。

    String 没有无参数构造函数。

    http://msdn.microsoft.com/en-us/library/system.string(v=vs.110).aspx

    【讨论】:

      【解决方案4】:

      String 没有 :new() 所需的公共参数少构造函数,并且要使用新约束,类型不能是抽象的。

      供您参考:字符串类

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-24
        • 1970-01-01
        • 1970-01-01
        • 2019-12-24
        • 1970-01-01
        • 2016-11-13
        • 1970-01-01
        • 2019-11-21
        相关资源
        最近更新 更多