我创建了一个自定义扩展方法,以便在代码中更容易地为视图添加约束。现在,当我想使用它时,我无法让它发挥作用。我导入了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#的一个缺陷还是应该这样(如果是这样,为什么?)?
答案 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.
,当您调用以相同类型声明的方法时,这些形式不存在。