【问题标题】:Implicit 'this' cannot reference extension methods in Xamarin隐式“this”无法引用 Xamarin 中的扩展方法
【发布时间】:2015-10-23 08:06:03
【问题描述】:

我创建了一个自定义扩展方法,以便在代码中更轻松地向视图添加约束。现在当我想使用它时,我无法让它工作。我导入了扩展所在的命名空间,并尝试使用隐式 this 调用它(所以没有指定它),但它不起作用。

所以我有这样的事情:

public static class ExtensionMethods {

    public static void Constrain(this UIView view, /*parameters with some defaults*/)
    {
        view.AddConstraint( /*the same parameters*/ );
    }
}

public class MyCustomView: UIView
{
    public MyCustomView()
    {
        Constrain(/*parameters*/);
    }
}

这没有用。然后我在Constrain 方法调用之前添加了this.,它的工作原理是这样的:

public static class ExtensionMethods {

    public static void Constrain(this UIView view, /*parameters with some defaults*/)
    {
        view.AddConstraint( /*the same parameters*/ );
    }
}

public class MyCustomView: UIView
{
    public MyCustomView()
    {
        this.Constrain(/*parameters*/);
    }
}

这是 Xamarin 的 C# 实现中的缺陷还是应该是这种方式(如果是,为什么?)?

【问题讨论】:

  • 这根本不是调用扩展方法的允许语法的一部分。您必须指定调用扩展方法的对象。我可以想象不支持这一点的部分理由是,如果类本身依赖于这个方法,那么它不应该是一个扩展方法,但显然我不知道他们为什么不选择实现对这个的支持.这在 Xamarin 之外也不受支持,因此这不仅仅是 Xamarin 实现中的一些失误,它只是不合法且允许的 C# 语法的一部分。

标签: c# xamarin xamarin.ios extension-methods


【解决方案1】:

这根本不是允许的语法的一部分。

调用扩展方法的语法在C# Specification,第 7.6.5.2 节 - 扩展方法调用中指定,如下所示:

7.6.5.2 扩展方法调用
在其中一种形式的方法调用(§7.5.5.1)中

expr . identifier ( )
expr . identifier ( args )
expr . identifier < typeargs > ( )
expr . identifier < typeargs > ( args )

如果调用的正常处理未找到适用的方法,则尝试将构造作为扩展方法调用进行处理。如果 expr 或任何 args 具有编译时类型 dynamic,则扩展方法将不适用。

您可以看到,法律形式涉及expr.,当您调用以相同类型声明的方法时,这是不存在的。

【讨论】:

  • 好的,你有建议的理由为什么会出现这种情况?我只是想了解它。
  • 我只能猜测,但请参阅我对您的问题所做的评论以了解此类猜测。
猜你喜欢
  • 2020-04-09
  • 2018-03-18
  • 2012-11-04
  • 2011-02-06
  • 1970-01-01
  • 1970-01-01
  • 2010-10-15
  • 1970-01-01
相关资源
最近更新 更多