C# 为什么不是';在这种情况下,不是最好的超载了吗?
我试图理解为什么下面代码的输出与我期望的不同C# 为什么不是';在这种情况下,不是最好的超载了吗?,c#,.net,casting,overloading,C#,.net,Casting,Overloading,我试图理解为什么下面代码的输出与我期望的不同 public static void Main(string[] _) { var a = new A(); var b = new B(); var ok = new System.Collections.Generic.List<object>() {a,b}.Select(x => Who(x)); Console.WriteLine(ok.Count()); }
public static void Main(string[] _)
{
var a = new A();
var b = new B();
var ok = new System.Collections.Generic.List<object>()
{a,b}.Select(x => Who(x));
Console.WriteLine(ok.Count());
}
public static Type Who(object o)
{
Console.WriteLine("I'm an OBJECT");
var type = o.GetType();
Console.WriteLine(type);
return type;
}
public static Type Who(A a)
{
a.Describe();
return a.GetType();
}
public static Type Who(B b)
{
b.Describe();
return b.GetType();
}
public class A
{
public virtual void Describe()
{
Console.WriteLine("I'm A");
}
}
public class B : A
{
public override void Describe()
{
Console.WriteLine("I'm B");
}
}
//OUTPUT
// I'm an OBJECT
// C+A
// I'm an OBJECT
// C+B
我必须做一个我当然不能做的演员
在实际代码中,我不知道集合的确切类型,我想使用重载根据类型执行不同类型的操作 如果要将重载解析延迟到运行时而不是编译时,则需要使用
动态
。在编译时,编译器必须使用的唯一类型是object
,所以这当然是选择的重载。为什么要在这里重载?将B
实例传递给Who(a)
与将其传递给Who(B)
的行为相同。在示例中,B
源自a
。如果在实际代码中,您也从公共根继承,那么您可以只指定这样一个根作为集合的类型,所有这些都将按预期工作。在这种情况下,创建一个只包含对象的泛型列表有点达不到目的。考虑使用<代码> var OK =新的List](…)/…< /代码>。使用object
和Who(objecto)
等写作方法就像将一张3D彩色照片转换成黑白照片一样
static Type Who(object o);