调用重载方法时,看的是声明类型。c# 是静态语言,编译器在编译阶段根据 var 的推断类型(即声明类型)来决定绑定哪个重载版本,而不是等到运行时查看实际对象的类型。

object 变量调用重载方法时,看的是什么?
当使用 object 作为变量类型时,编译器将其视为最基础的基类类型,因此会优先匹配参数为 object 的重载方法,而忽略更具体的派生类重载。

using System;
public class Animal { }
public class Dog : Animal { }
public class Program
{
public static void Process(Animal a) => Console.WriteLine("Animal");
public static void Process(Dog d) => Console.WriteLine("Dog");
public static void Main()
{
object obj = new Dog();
Process(obj); // 输出: Animal
}
}
dynamic 变量调用重载方法时,看的是什么?
当使用 dynamic 关键字时,重载解析被推迟到运行时,此时会根据变量的实际运行类型来匹配最合适的重载方法。

using System;
public class Animal { }
public class Dog : Animal { }
public class Program
{
public static void Process(Animal a) => Console.WriteLine("Animal");
public static void Process(Dog d) => Console.WriteLine("Dog");
public static void Main()
{
dynamic dyn = new Dog();
Process(dyn); // 输出: Dog
}
}
同一输入下 var 与 dynamic 的结果差异是什么?
对于同一个 Dog 实例,var 会输出 "Animal",而 dynamic 会输出 "Dog"。这验证了 var 遵循编译期静态类型,而 dynamic 遵循运行期动态类型。










