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中特别有用,因此您可以创建临时投影而无需显式创建全新类型.
有一些方法可以使用通用方法:
public static List<T> CreateList<T>(T example) {
return new List<T>();
}
...
var list = CreateList(x);
Run Code Online (Sandbox Code Playgroud)
或者通过创建包含数据的列表然后清空它...