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