代码之家  ›  专栏  ›  技术社区  ›  Display Name Camilo Terevinto

如果两者都存在,如何调用foo(这个对象o)而不是foo(这个t)?

c#
  •  1
  • Display Name Camilo Terevinto  · 技术社区  · 15 年前

    如何调用扩展对象类的显示方法?

    static class Tools
    {
        public static void Display<T>(this T t)
        {
            Console.WriteLine("generic: " + t.GetType());
    
        }
    
        public static void Display(this object o)
        {
            Console.WriteLine("object: " + o.GetType());
        }
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            int i = 100;
    
    
            // all  will invoke the generic version.
            Tools.Display<int>(i);
            i.Display();
            Tools.Display(i);
    
        }
    }
    
    3 回复  |  直到 15 年前
        1
  •  9
  •   Travis Gockel    15 年前

    我记不清标准里写的是什么,但是C更喜欢叫 最具体 超载。对于泛型,函数的通用版本几乎总是优先考虑。所以当一个 int 是一个 object 它更适合 Display<T>(T) Display(object) ,自从实现了通用( Display<int>(int) )完全匹配。加上C可以确定哪些类型属于 T 你自己就能看到你正在经历的行为。

    因此,必须显式转换为对象才能调用对象版本:

    ((object)i).Display();
    

    可选地:

    Tools.Display((object)i);
    

    如果你这样做,你会有一个奇怪的(但明智的)问题:

    object o = 5;
    o.Display();
    o.Display<object>();
    

    这将调用 对象 第一种情况下为版本,第二种情况下为通用版本。参数的乐趣时光!

        2
  •  1
  •   Fredrik Mörk    15 年前

    自从 i 是一个 int ,泛型重载比采用 object . 如果你投 对象 将调用非通用版本。

        3
  •  0
  •   this. __curious_geek    15 年前

    显示方法是冗余的。实际上,您不需要同时使用这两种方法。

    首先,让我解释一下为什么它总是执行通用版本而不是其他版本。

    C编译器将找到方法调用的最佳类型匹配。在所有的调用中,generic方法是最好的匹配方法,因为generic版本的类型参数总是与调用中给出的类型参数相同。

    对于tools.display(i)调用编译器更喜欢通用版本,因为这是基于类型匹配的最佳选项。

    即使在其他调用中,类型也是从参数中推断出来的,因此更倾向于调用泛型版本。