鉴于此扩展方法
public static void Until(this Action action, Func<bool> booleanFunc)
{
while (!booleanFunc())
action();
}
是否可以改变这个
var x = 0;
Action ac = () => x += 1;
ac.Until(() => x == 5);
成为这种东西
var x = 0;
(() => x += 1).Until(() => x == 5);
那就是一个班轮?
答案 0 :(得分:3)
好的lambdas需要一种类型。单独说() => x += 1
没有说它应该代表的代表。因此,通过将lambda传递给构造函数来提供lambda的类型。
new Action(() => x += 1).Until(() => x == 5);
演员阵容也有效。
((Action)(() => x += 1)).Until(() => x == 5);
答案 1 :(得分:2)
不幸的是,这种语法是不可能的,因为编译器无法推断出匿名表达式的类型。它可能是Action,但也可能是其他一些自定义委托。您需要将其投射到Action
。
答案 2 :(得分:1)
有趣的是 - 我discovered the same thing a while ago。
扩展方法调用在C#规范的7.6.5.2节中描述,在我看来,满足所有条件......因为根据表达式进行说明可以隐式转换为第一个参数类型(在这种情况下,它是)。这表明编译器中存在错误(可能,但不太可能),或者不满足其中一个有效方法调用的早期条件。
我怀疑问题是lambda表达式在规范术语中不是 primary-expression - 不幸的是,由于感冒,我的spec-fu今天早上没有太多。很多方法调用机制的其余部分可能依赖于知道方法目标的类型,在这种情况下是未知的。
请注意,另一个显眼的“无类型表达式”也存在同样的问题 - 您也无法在null
字面上调用扩展方法。
偶尔这种限制是一种痛苦,但大多数时候我没有太大的问题 - 而且我怀疑它使编译器的实现更加简单......