在c#中,为什么lambda不能有扩展?
在Unity中,这是c#中的一个类别,
public static class HandyExtensions { public static IEnumerator Tweeng( this System.Action v, float d ) { while (..) { .. v( 13f*t ); yield return null; } v(13f); }
编译好!
但是如果你试着用它,
yield return StartCoroutine( ( (x)=>laser=x ).Tweeng(3.141f) );
出现这种令人悲伤的错误 :
资产/脚本/ … cs(116,34):错误CS0023:The
.' operator cannot be applied to operand of type
.' operator cannot be applied to operand of type
匿名方法.' operator cannot be applied to operand of type
‘
我为此感到眼泪。
怎么可能让我失望?
当然有一种方法可以称之为“on”这样的lambda,用于扩展?
BTW的解决方法是去3.14f.Tweeng((x)=>laser=x)
但它并不酷。
对不起,对你很伤心,但是这个选择是由语言设计团队刻意做出的。 评估给定扩展方法是否有效的代码要求接收方具有clear类型,而lambda表达式没有类型。
关于这一点存在一些争论,但最终决定(1)如果像lambdas,方法组和null文字等无类表达式成为扩展方法的接收者,(1)所提出的特征可能容易混淆或容易出错,并且(2)所提出的function根本不是使LINQ工作所必需的。 在实施C#3时,我们的日程安排非常紧张,并且任何不需要使LINQ工作的东西都被削减了。 设计,实现和测试“不允许lambdas作为接收器”的特性要比考虑lambda,方法组或null被用作接收器的所有可能奇怪的情况要容易得多。
正如其他人所说,你可以简单地转换lambda,或者将它放在一个变量中,然后使用变量作为接收器。
或者,如您所知,您可以考虑在特定示例中将float用作接收器。
平息你的眼泪公平乔,不要绝望驱使你离开你的梦想! 如果你明确地施展它,它应该工作。 尝试:
yield return StartCoroutine( ((System.Action)( (x)=>laser=x )).Tweeng(3.141f) );