【问题标题】:In c#, why can't lambdas have extensions?在 c# 中,为什么 lambdas 不能有扩展?
【发布时间】:2016-09-15 10:15:06
【问题描述】:

在 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)
        );

出现了这个令人痛心的错误

资产/脚本/...cs(116,34):错误 CS0023:.' operator cannot be applied to operand of typeanonymous 方法'

我为此流泪。

c# 怎么会让我们失望?

肯定有一种方法可以为扩展调用“on”这样的 lambda?

顺便说一句,解决方法是使用3.14f.Tweeng((x)=&gt;laser=x),但这并不酷。

【问题讨论】:

  • 眼泪?伤心?你能把这个问题的戏剧性淡化一点吗?
  • 哇——我们的观点差不多!和数学未成年人。打开幽默检测器 :)
  • 您现在可能应该已经意识到,您在本网站提出的任何问题不属于您。他们属于社区。问题应该是专业和清晰的,并且没有额外的“绒毛”来分散他们的注意力。如果有人有类似的问题并用谷歌搜索,当他们看到你的标题时,他们会分心或困惑。这是不必要的。
  • 你甚至不是一个非英语母语的人,没有任何借口:) 无论如何这是一个严肃的问题,严肃的 cmets 在哪里??
  • 请不要命名var。 C# 已经过精心设计,因此这样做是合法的,因此遗留代码不会变得非法。但是它很可能与隐式类型局部变量的声明语法混淆,因此在新代码中这样做是一种不好的做法。

标签: c# lambda


【解决方案1】:

很抱歉,这让您感到难过,但这个选择是语言设计团队故意做出的。评估给定扩展方法是否有效的代码要求接收者具有明确的类型,而 lambda 表达式没有类型。

关于这一点存在一些争论,但最终决定 (1) 如果像 lambda、方法组和空字面量这样的无类型表达式成为扩展方法的接收者,那么提议的特性可能会造成混淆或容易出错,并且(2) 所提出的特性对于使 LINQ 工作完全没有必要。在实施 C# 3 时,我们的日程安排非常受限制,并且任何不需要 LINQ 工作的东西都被削减了。设计、实现和测试“不允许 lambdas 作为接收器”的特性要比必须考虑使用 lambda、方法组或 null 作为接收器的所有潜在奇怪情况要容易得多。

正如其他人所说,您可以简单地转换 lambda,或将其放入变量中,然后将该变量用作接收器。

或者,正如您所指出的,您可以考虑在您的具体示例中使用浮点数作为接收器。

【讨论】:

  • 既然你解释了它就很有意义了。 * 敬畏 * 谢谢!
  • 我会说这是一个关于“可能令人困惑或容易出错”的好电话。如果到处都是,那可能是一团糟。
  • 可以肯定的是,如果你做演员或new lambda,确实很漂亮。将 lambdas 发送到扩展程序可以在游戏页面上生成漂亮、漂亮的代码。大多数语言,尤其是 c#,如果使用得当,就会在页面上呈现出一种与生俱来的自然美感。
  • 无意打扰你@EricLippert .. 只是occurred to me 你不能在当前c# 中隐藏属性的后备变量。作为一种语言设计dilletente,这让我很感兴趣;那不是一个高优先级的项目吗?当然,我可能完全糊涂了——这是不言而喻的。
  • @JoeBlow:我不确定你到底在说什么,但这可能与此有关:blogs.msdn.microsoft.com/ericlippert/2009/01/14/…
【解决方案2】:

平息你的眼泪公平的乔,不要让绝望把你从你的梦想赶走!如果您明确地转换它,它应该可以工作。 试试:

yield return StartCoroutine(
        ((System.Action<float>)( (x)=>laser=x )).Tweeng(3.141f)
    );

【讨论】:

  • 或者新的new Action&lt;float&gt;(x =&gt; laser = x).Tweeng(3.141f)
猜你喜欢
  • 2011-01-11
  • 2010-12-10
  • 1970-01-01
  • 1970-01-01
  • 2011-12-06
  • 2016-09-16
  • 1970-01-01
  • 2023-04-02
相关资源
最近更新 更多