31

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

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

给我错误:

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

虽然这个工作得很好:

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

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

4

5 回答 5

36

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

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

我认为这是一个错字,因此您可以在第一个示例的最后一个条目中更改BA

来自MSDN

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

于 2013-10-23T07:25:58.703 回答
35

您可以使用:

var marketValueData = new object[] {
    new { A = "" },
    new { A = "" },
    new { B = "" },
    ...,
};
于 2015-12-19T08:38:34.973 回答
5

匿名类型必须相同。只需更改BA.

于 2013-10-23T07:29:05.450 回答
2

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

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

student 和 course 都从 SQWEntity 继承,但由于某种原因编译器不检查基类型。只有将数组类型设置为 SQWEntity 才能解决该错误。

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

当然没有必要在这样的行中指定类型,其中学生1,学生2是相同的类型。

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

于 2019-07-07T08:46:14.770 回答
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 = "" },
};
于 2021-07-02T19:26:34.580 回答