Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果两者都存在,如何调用Foo(这个对象o)而不是Foo(这个T)?_C# - Fatal编程技术网

C# 如果两者都存在,如何调用Foo(这个对象o)而不是Foo(这个T)?

C# 如果两者都存在,如何调用Foo(这个对象o)而不是Foo(这个T)?,c#,C#,如何调用扩展对象类的显示方法 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.Get

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

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);

    }
}
静态类工具
{
公共静态无效显示(此T)
{
Console.WriteLine(“generic:+t.GetType());
}
公共静态无效显示(此对象为o)
{
WriteLine(“对象:+o.GetType());
}
}
班级计划
{
静态void Main(字符串[]参数)
{
int i=100;
//所有这些都将调用通用版本。
工具展示(一);
i、 显示();
工具展示(一);
}
}

我不记得它在标准中的什么地方说过,但C更喜欢调用最具体的重载。对于泛型,函数的泛型版本几乎总是首选。因此,虽然
int
对象,但它比
Display(object)
更适合
Display(T)
,因为通用(
Display(int)
)的实现是完全匹配的。再加上C#可以自己判断出
T
中属于哪种类型,你就能看到自己正在经历的行为

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

((object)i).Display();
或者:

Tools.Display((object)i);

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

object o = 5;
o.Display();
o.Display<object>();
对象o=5;
o、 显示();
o、 显示();

这将在第一种情况下调用
对象
版本,在第二种情况下调用通用版本。有趣的参数时间

我不记得它在标准中的什么地方说过,但C#更喜欢称最具体的重载。对于泛型,函数的泛型版本几乎总是首选。因此,虽然
int
对象,但它比
Display(object)
更适合
Display(T)
,因为通用(
Display(int)
)的实现是完全匹配的。再加上C#可以自己判断出
T
中属于哪种类型,你就能看到自己正在经历的行为

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

((object)i).Display();
或者:

Tools.Display((object)i);

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

object o = 5;
o.Display();
o.Display<object>();
对象o=5;
o、 显示();
o、 显示();

这将在第一种情况下调用
对象
版本,在第二种情况下调用通用版本。有趣的参数时间

由于
i
int
,因此泛型重载比接受
对象的重载更匹配。如果将
i
强制转换为
对象
,将调用非泛型版本。

由于
i
是一个
int
,泛型重载比使用
对象
的重载更匹配。如果将
i
强制转换为
对象
,将调用非通用版本。

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

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

C#编译器将为方法调用找到最佳类型匹配。在所有调用中,泛型方法是最匹配的,因为泛型版本的类型参数始终与调用中给定的类型参数相同

因此对于Tools.Display(i)调用编译器更喜欢泛型版本,因为这是基于类型匹配的最佳选项


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

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

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

C#编译器将为方法调用找到最佳类型匹配。在所有调用中,泛型方法是最匹配的,因为泛型版本的类型参数始终与调用中给定的类型参数相同

因此对于Tools.Display(i)调用编译器更喜欢泛型版本,因为这是基于类型匹配的最佳选项


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

+1用于指定双向,因为OP将其声明为扩展方法。+1用于指定双向,因为OP将其声明为扩展方法。