方法重载多态性是否在 C# 中早期绑定?

Is method overloading polymorphism Early Bound in C#?

在 C# 中,如果我有

public class BaseClass
{
    //BaseClass implementation
}

public class Derived : BaseClass
{
    //Derived implementation
}

public class AnotherClass
{
    AnotherClass(BaseClass baseClass)
    {
        //Some code
    }

    AnotherClass(Derived derived) : this(derived as BaseClass)
    {
        //Some more code
    }
}

然后做:

BaseClass    baseVariable    = new Derived();
AnotherClass anotherVariable = new AnotherClass(baseVariable);

这将导致提前绑定,调用 AnotherClass(BaseClass) 方法。

相反,如果我使用 dynamic 关键字对其进行转换 - 或者使用 dynamic 实例化一个变量,然后将其作为构造函数参数传递,将调用 AnotherClass(Derived)

BaseClass    baseVariable    = new Derived();
//This will instantiate it using the AnotherClass(Derived)
AnotherClass anotherVariable = new AnotherClass(baseVariable as dynamic);

方法是否在 C# 中重载早期绑定(在编译时求值)?这意味着,是否有任何其他方法或技巧 来确定对另一个 class 构造函数的 mostly-derived 调用 以应用采用 mostly derived [=] 的构造函数的调用29=] 在不使用 dynamic 或反射的情况下作为参数输入?

C#中的绑定时间取决于绑定是否涉及dynamic。如您所见,如果您使用 dynamic ,您将获得执行时重载决议;如果不这样做,您将获得编译时重载解决方案。

请注意,即使重载决策涉及动态类型,它仍将使用编译时已知的信息——只有 dynamic 类型的表达式使用执行时类型。例如:

using System;

class Test
{
    static void Main()
    {
        object x = "abc";
        dynamic y = 10;

        Foo(x, y); // Prints Foo(object,int)
    }

    static void Foo(object x, int y)
    {
        Console.WriteLine("Foo(object,int)");
    }

    static void Foo(string x, int y)
    {
        Console.WriteLine("Foo(string,int)");
    }
}

如果将 x 的声明类型更改为 dynamic 执行时类型将是相关的(并且它将打印 Foo(string,int)).

当然,这只是重载决议 - 重写 总是 在执行时确定,除非您使用的是非虚拟调用(要么调用非虚拟方法, 或使用 base.Foo(...).

关于这一点:

Is there any other way or trick to determine the mostly-derived call to the other class constructor - apart reflection?

找出存储在引用中的对象的最派生类型的唯一方法是查询它(使用 GetType 或其他)。所以不,反思在这里是不可避免的。

如果您已经知道最派生的类型是什么,您当然可以在传入之前转换为它,以便在编译时选择适当的重载。您也可以在第一个代码段中使用 var 来自动使用派生程度最高的类型作为参考。