【发布时间】:2017-08-30 06:44:18
【问题描述】:
从 C# 6 开始,lambdas 现在默认为实例方法,并且永远不会是静态的(我假设这意味着它们现在总是捕获,我想这更有效 [考虑到讨论似乎更快])。
请看这里:Why has a lambda with no capture changed from a static in C# 5 to an instance method in C# 6?
这里:Difference in CSC and Roslyn compiler's static lambda expression evaluation?
这会导致在创建静态 MethodInfos 以调用 Expression.Convert(Expression, typeof({SomeType}), conversionMethodInfo); 等表达式方法时使用 lambdas 时出现问题
那么,这样做的新方法是什么?我尝试将“静态”修饰符与 lambda 一起使用,但它不起作用。对于那些无法想象这样的代码的人来说,这可能是一个例子:
Func <T1,T2> converter = static v => ConvertT1ToT2(v); // ('T' is whatever type you want)
Expression.Convert(expression, typeof({SomeType}), converter.Method) // (error: converter.Method.IsStatic is false)
是的,显然它不起作用。
【问题讨论】:
-
您能告诉我们您“尝试过”什么以及为什么您认为“它不起作用”吗?
-
当规范发生变化而现在没有关于新事物的文档时,谁能尝试任何东西?大声笑想象一个 lambda 表达式,然后想象所有在其上放置“静态”修饰符的方法,这就是我尝试过的(我知道这是不可能的,但以防万一他们足够聪明,可以将其放入此版本中以进行补偿) .
-
您是否有理由不能将其提升为私有静态表达式值成员?
-
是的,因为它不能解决问题。 ;)(也不回答问题)
-
那为什么要停在那里?只需将其提升为实际的静态方法,然后在我的课堂上乱扔它们。 ;) 我希望将它们分组在它所使用的唯一方法中,但现在我可能不得不“弄脏”我的班级。