隐含的'这个'不能在Xamarin中引用扩展方法

时间:2015-10-23 08:06:03

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

我创建了一个自定义扩展方法,以便在代码中更容易地为视图添加约束。现在,当我想使用它时,我无法让它发挥作用。我导入了extesion所在的命名空间,我尝试使用隐式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*/);
    }
}

哪个不起作用。然后我在this.方法调用之前添加了Constrain,它的工作原理如下:

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#的一个缺陷还是应该这样(如果是这样,为什么?)?

1 个答案:

答案 0 :(得分:4)

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

调用扩展方法的语法在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.,当您调用以相同类型声明的方法时,这些形式不存在。