我创建了一个自定义扩展方法,以便在代码中更容易地向视图添加约束。现在当我想用它的时候,我不能让它工作。我导入了扩展所在的名称空间,并尝试使用隐式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#实现中的一个缺陷,还是应该是这样的(如果是,为什么?)?
这根本不是允许的语法的一部分。
调用扩展方法的语法在c#规范第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或任何参数的编译时类型是动态的,则扩展方法将不适用。
你可以看到合法的形式涉及到expr.
,当你调用在同一类型中声明的方法时,这是不存在的。