为什么我们需要在Extension方法而不是静态方法的情况下进行显式转换?

时间:2012-02-17 02:19:07

标签: c#-3.0 extension-methods

为什么Extension方法不使用隐式转换,但静态方法呢?任何人都可以用适当的例子来解释吗?

由于

1 个答案:

答案 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#无法明确选择要执行的隐式转换。