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

ano*_*ard 6 c# generics implicit-typing c#-3.0

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

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

如果没有,我真的没有看到隐含类型中的那么多内容......

Jon*_*eet 12

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

但是,你可以这样做:

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

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

public static List<T> InList<T>(this T item)
{
    return new List<T> { item };
}
Run Code Online (Sandbox Code Playgroud)

(如果你想要选择一个不同的名字:)

然后:

var x = new { a = "foobar", b = 42 };
var y = x.InList();
Run Code Online (Sandbox Code Playgroud)

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

隐式类型的局部变量由于各种原因很有用,但它们在LINQ中特别有用,因此您可以创建临时投影而无需显式创建全新类型.


Mar*_*ell 6

有一些方法可以使用通用方法:

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

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