Run*_*une 22 c# static dynamic c#-4.0
为什么C#编译器不告诉我这段代码无效?
class Program
{
static void Main(string[] args)
{
dynamic d = 1;
MyMethod(d);
}
public void MyMethod(int i)
{
Console.WriteLine("int");
}
}
Run Code Online (Sandbox Code Playgroud)
调用MyMethod在运行时失败,因为我试图从静态方法调用非静态方法.这是非常合理的,但为什么编译器在编译时不认为这是一个错误?
以下内容无法编译
class Program
{
static void Main(string[] args)
{
dynamic d = 1;
MyMethod(d);
}
}
Run Code Online (Sandbox Code Playgroud)
所以尽管动态调度,编译器会检查是否MyMethod存在.为什么不验证"静态"?
Han*_*ant 14
这里的过载分辨率是动态的.在此代码段中可见:
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");
}
}
Run Code Online (Sandbox Code Playgroud)
工作良好.现在将1分配给d并记下运行时故障.编译器无法在编译时合理地模拟动态重载决策,因此它不会尝试.