gpt4 book ai didi

c# - 为什么 C# 编译器不使用动态参数检查调用站点方法的 "staticness"?

转载 作者:IT王子 更新时间:2023-10-29 04:31:24 31 4
gpt4 key购买 nike

为什么 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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com