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将其声明为扩展方法。