为什么 C# 编译器不告诉我这段代码无效?
class Program
{
static void Main(string[] args)
{
dynamic d = 1;
MyMethod(d);
}
public void MyMethod(int i)
{
Console.WriteLine("int");
}
}
对 MyMethod
的调用在运行时失败,因为我试图从静态方法调用非静态方法。这是非常合理的,但为什么编译器在编译时不认为这是一个错误呢?
下面的不会编译
class Program
{
static void Main(string[] args)
{
dynamic d = 1;
MyMethod(d);
}
}
因此尽管是动态分派(dispatch),编译器确实会检查 MyMethod
是否存在。为什么不验证“静态”?
最佳答案
这里的过载解析是动态的。在此代码段中可见:
class Program {
public static void Main() {
dynamic d = 1.0;
MyMethod(d);
}
public void MyMethod(int i) {
Console.WriteLine("int");
}
public static void MyMethod(double d) {
Console.WriteLine("double");
}
}
工作正常。现在将 1 分配给 d 并注意运行时故障。编译器无法在编译时合理模拟动态重载解析,因此不会尝试。
关于c# - 为什么 C# 编译器不使用动态参数检查调用站点方法的 "staticness"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8105879/