6
var x = new { a = "foobar", b = 42 };
List<x.GetType()> y;

有没有不同的方式来做我想做的事情?

如果没有,我真的看不出隐式类型有那么多意义......

4

2 回答 2

11

x.GetType()是一个方法调用,在执行时评估。因此它不能用于像变量类型这样的编译时概念。我同意偶尔能够做类似的事情会非常方便(将变量的编译时类型指定为别处的类型参数),但目前你不能。我不能说我经常想念它。

但是,您可以这样做:

var x = new { a = "foobar", b = 42 };
var y = new[] { x };
var z = y.ToList();

您还可以编写一个简单的扩展方法来创建一个列表:

public static List<T> InList<T>(this T item)
{
    return new List<T> { item };
}

(如果需要,请选择不同的名称:)

然后:

var x = new { a = "foobar", b = 42 };
var y = x.InList();

正如 Marc 所示,它实际上根本不必是扩展方法。唯一重要的是编译器可以使用类型推断来计算方法的类型参数,这样您就不必尝试命名匿名类型。

隐式类型化的局部变量有多种用途,但它们在 LINQ 中特别有用,因此您可以创建临时投影而无需显式创建全新类型。

于 2009-10-15T06:15:57.670 回答
6

使用通用方法可以做到这一点:

public static List<T> CreateList<T>(T example) {
    return new List<T>();
}
...
var list = CreateList(x);

或者通过创建一个包含数据的列表然后清空它......

于 2009-10-15T06:17:11.273 回答