为什么Extension方法不使用隐式转换,但静态方法呢?任何人都可以用适当的例子来解释吗?
由于
答案 0 :(得分:1)
因为C#规范声明:
如果符合以下条件,则扩展方法Ci.Mj符合条件:
·Ci是非通用的非嵌套类
·Mj的名称是标识符
·Mj在申请时适用且适用 作为静态方法的参数如上所示
·存在隐式标识,引用或装箱转换 从expr到Mj的第一个参数的类型。
就C#规范而言,用户定义的转换运算符与隐式引用转换不同,当然也不同于标识或装箱转换。
有关原因的提示:
public static class Extensions
{
public static void DoSomething(this Bar b)
{
Console.Out.WriteLine("Some bar");
}
public static void DoSomething(this Boo b)
{
Console.Out.WriteLine("Some boo");
}
}
public class Foo
{
public static implicit operator Bar(Foo f)
{
return new Bar();
}
public static implicit operator Boo(Foo f)
{
return new Boo();
}
}
public class Bar { }
public class Boo { }
public class Application
{
private Foo f;
public void DoWork()
{
// What would you expect to happen here?
f.DoSomething();
// Incidentally, this doesn't compile either:
Extensions.DoSomething(f);
}
}
C#无法明确选择要执行的隐式转换。