为什么我不能用C#中的隐式类型执行此操作?

时间:2009-10-15 06:08:06

标签: c# generics implicit-typing c#-3.0

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

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

如果没有,我在隐式类型中并没有真正看到那么多......

2 个答案:

答案 0 :(得分:12)

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中特别有用,因此您可以创建临时投影而无需显式创建全新类型。

答案 1 :(得分:6)

使用通用方法可以实现此目的:

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

或通过使用数据创建列表,然后将其清空......