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