C# 为什么可以';t匿名类具有lambda属性,但它可以具有Func<&燃气轮机;财产?
我想学习C#对匿名类型的限制。考虑下面的代码:C# 为什么可以';t匿名类具有lambda属性,但它可以具有Func<&燃气轮机;财产?,c#,C#,我想学习C#对匿名类型的限制。考虑下面的代码: var myAwesomeObject = new { fn1 = new Func<int>(() => { return 5; }), fn2 = () => { return 5; } }; var myAwesomeObject=new{ fn1=新函数(()=>{return 5;}), fn2=()=>{return 5;} }; 我们有两个属性,它们实际上是函数: fn1
var myAwesomeObject = new {
fn1 = new Func<int>(() => { return 5; }),
fn2 = () => { return 5; }
};
var myAwesomeObject=new{
fn1=新函数(()=>{return 5;}),
fn2=()=>{return 5;}
};
我们有两个属性,它们实际上是函数:
:返回fn1
的5
Func
:返回fn2
的lambda函数5
有人能解释为什么一个可以,而另一个不行吗?因为编译器无法知道
()=>{return 5;}
的类型;它可以是Func
,也可以是具有相同签名的任何其他委托(也可以是表达式树)。这就是为什么必须显式指定类型 编译器找不到与匿名方法匹配的类型。如果在可以确定类型的上下文中使用匿名方法(如在方法调用中),它将强制或使用类型,但在这种情况下,它不会选择匹配的类型。如果您选择:var fn2=()=>{return 5;}代码>C#编译器不知道lambda是委托树还是表达式树。解决方案是实例化您想要创建的一个。@Thomas是对的,但是Eric Lippert给出了一个更完整的答案:啊。。。所以这是一个类型推断问题。对于本例中最优雅的代码,您的建议是什么?我能做些什么来改进fn1定义吗?@StephenGross,好的,您也可以将lambda转换为委托类型:fn1=(Func)(()=>{return 5;})
;但我更喜欢显式的委托创建,就像你在问题中所做的那样;它可能是一个表达式
!