找不到隐式类型数组的最佳类型

时间:2013-10-23 07:23:35

标签: c#

有人可以解释一下为什么这段代码:

var marketValueData = new[] {
    new { A = "" },
    new { A = "" },
    new { B = "" },
};

给我错误:

  

找不到隐式类型数组的最佳类型

虽然这个完美无缺:

var marketValueData = new[] {
    new { A = "" },
    new { A = "" },
    new { A = "" },
};

除了第一个示例的最后一个条目中的不同属性(B)之外,它们是相同的。然而第一个没有编译。为什么呢?

5 个答案:

答案 0 :(得分:32)

这是因为在第一个例子中你有两个不同的匿名类型,最后一个项目的定义与其他项目的定义不同。

在第一个示例中,一个包含A属性,另一个包含B属性,编译器无法确定数组的类型。在第二个示例中,有一个匿名类型,仅包含A

我认为这是拼写错误,因此您可以在第一个示例的最后一个条目中将B更改为A

来自MSDN

  

您可以创建一个隐式类型数组,其中包含类型   数组实例是从数组中指定的元素推断出来的   初始化程序。

答案 1 :(得分:26)

您可以使用:

var marketValueData = new object[] {
    new { A = "" },
    new { A = "" },
    new { B = "" },
    ...,
};

答案 2 :(得分:5)

匿名类型必须相同。只需将B更改为A

答案 3 :(得分:0)

我在这样的代码行中遇到了类似的问题

sqwOraContext.save(new [] {学生,课程});

学生和课程都继承自SQWEntity,但是出于某种原因,编译器不会检查基本类型。 仅将数组类型设置为SQWEntity可以解决该错误。

sqwOraContext.save(new SQWEntity [] {学生,课程});

当然,在Student1和Student2具有相同类型的情况下,无需在这样的行中指定类型。

sqwOraContext.save(new [] {student1,student2});

答案 4 :(得分:0)

你也可以写一个强匿名类型:

var d = default(string); // default value for A and B properties
var marketValueData = new[] {
    new { A = "", B = d },
    new { A = "", B = d },
    new { A = d, B = "" },
};