【问题标题】:'MyObject[]' must be a non-abstract type with a public parameterless constructor to use it as parameter 'T''MyObject[]' 必须是具有公共无参数构造函数的非抽象类型才能将其用作参数 'T'
【发布时间】:2017-06-29 08:12:10
【问题描述】:

在 MyRequest 类中我有:

public static T RetrieveData<T>(Uri uri) where T : class, new()
{
        return requestData<T>(query);
}

Uri 返回一个字符串数组,例如:

{

 "prop1": "JOHN",
 "prop2": "JULIE",
 "value": 9

}, 
{

 "prop1": "KATE",
 "prop2": "Ryan",
 "value": 8

}

这就是我调用我的方法的方式:

var obj = MyRequest.RetrieveData<MyObject[]>("http://.....");   

这是 MyObject 的定义方式:

public class MyObject
    {
        public string prop1;
        public string prop2; 
        public double value; 
    }

这是我得到的错误:

MyObject[]' 必须是具有公共无参数构造函数的非抽象类型,才能将其用作泛型类型或方法 'MyRequest.RetrieveData(uri)' 中的参数 'T'

当我调整 uri 以仅返回一个包含 1 个元素的数组并调用它时,我的方法可以正常工作:

var obj = MyRequest.RetrieveData<MyObject>("http://....."); 

而不是

MyObject[]

但我确实需要使用数组。 有什么想法吗?

【问题讨论】:

  • 改用List&lt;MyObject&gt;?不幸的是,这里没有足够的信息来完全回答。
  • 就像一个魅力!非常感谢你。如果您愿意,可以将其添加为答案。

标签: c# generics


【解决方案1】:

这是因为类型 T[] 是 固定大小 数组并且没有无参数构造函数。很明显,固定大小的数组需要这个大小。例如:

var foo = new bar[0];
var foo = new bar[123];
var foo = new bar[count];

你不能这样初始化:

var foo = new bar[]();
var foo = new bar[];

所以很明显 new() 量词不能用于固定大小的数组。

【讨论】:

    【解决方案2】:

    您应该尝试反序列化为 List&lt;T&gt; 而不是数组,因为您的 JSON 库(可能是 JSON.Net,但很难从您的代码中猜到)要求该类型具有构造函数。例如:

    var obj = MyRequest.RetrieveData<List<MyObject>>("http://.....");   
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-18
      • 1970-01-01
      • 1970-01-01
      • 2011-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多