下面的代码是有效的:
IEnumerable<SomeThing> things = ...;
// map type SomeThing to a new anonymous type, resulting in a strongly typed
// sequence based on an anon type
var newList = things.Select(item =>
{
return new
{
ID = item.ID,
DateUpdatedOrCreated = ((DateTime)(item.DateUpdated ??
item.DateCreated)).ToShortDateString(),
Total = item.Part1 + item.Part2
};
});
newList 现在出现在 Visual Studio 中,IEnumerable<'a>
并且是在函数中创建的匿名类型的强类型。那太酷了。
我似乎无法做的是找出一种仅将 lambda 表达式(而不是枚举)分配给隐式类型变量的方法。即使编译器对上述上下文中的匿名类型没有问题,如果我尝试(比如说)
var func = (SomeThing item)=> {
return new { ... };
};
我收到错误“无法将 lambda 表达式分配给隐式类型的局部变量”。这似乎是一个奇怪的编译器限制;除非我遗漏了什么,否则第二个示例中的类型与第一个示例中的类型一样明确:两个类型参数都定义明确。
有没有办法做到这一点?由于它是匿名类型,当然,我没有任何方法可以使用类型来显式分配它,所以如果没有,我似乎会坚持为输出类型创建一个类。
更新
在对 Jon Skeet 的回答进行愉快的回答后不久,我发现了一个类似的实例化类的困境。如果不是很明显,可以使用相同的技巧来创建使用推断匿名类型的强类型类。
class Processor<T,U>
{
public Processor(Func<T,U> func) {
}
}
// func is a delegate with anon return type created using method in answer below
var instance = new Processor(func); // does not compile! Requires type arguments!
不能直接创建,但可以通过与以下技巧大致相同的方式创建:
public static Processor<T,U> Create<T,U>(Func<T,U> func) {
return new Processor<T,U>(func);
}
var instance = Processor.Create(func); // all good