Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么可以';t匿名类具有lambda属性,但它可以具有Func<&燃气轮机;财产?_C# - Fatal编程技术网

C# 为什么可以';t匿名类具有lambda属性,但它可以具有Func<&燃气轮机;财产?

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

我想学习C#对匿名类型的限制。考虑下面的代码:

  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
    :返回
    5
    的lambda函数
C#编译器很乐意使用fn1,但抱怨fn2:

无法将lambda表达式分配给匿名类型属性


有人能解释为什么一个可以,而另一个不行吗?

因为编译器无法知道
()=>{return 5;}
的类型;它可以是
Func
,也可以是具有相同签名的任何其他委托(也可以是表达式树)。这就是为什么必须显式指定类型

编译器找不到与匿名方法匹配的类型。如果在可以确定类型的上下文中使用匿名方法(如在方法调用中),它将强制或使用类型,但在这种情况下,它不会选择匹配的类型。如果您选择:
var fn2=()=>{return 5;}C#编译器不知道lambda是委托树还是表达式树。解决方案是实例化您想要创建的一个。@Thomas是对的,但是Eric Lippert给出了一个更完整的答案:啊。。。所以这是一个类型推断问题。对于本例中最优雅的代码,您的建议是什么?我能做些什么来改进fn1定义吗?@StephenGross,好的,您也可以将lambda转换为委托类型:
fn1=(Func)(()=>{return 5;})
;但我更喜欢显式的委托创建,就像你在问题中所做的那样;它可能是一个
表达式