gpt4 book ai didi

c# - 为什么 C# 编译器使用无效方法的重载?

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

我被下面的代码搞糊涂了

class A
{
public void Abc(int q)
{
Console.Write("A");
}
}

class B : A
{
public void Abc(double p)
{
Console.Write("B");
}
}

...
var b = new B();
b.Abc((int)1);

代码执行的结果是“B”写入控制台。

实际上B类包含两个Abc方法的重载,第一个用于int参数,第二个用于double。为什么编译器对整数参数使用 double 版本?

注意 abc(double) 方法不会覆盖或覆盖 abc(int) 方法

最佳答案

由于编译器可以将int隐式转换为double,所以选择了B.Abc方法。这在 this post by Jon Skeet 中有解释。 (搜索“隐式”):

The target of the method call is an expression of type Child, so thecompiler first looks at the Child class. There's only one methodthere, and it's applicable (there's an implicit conversion from int todouble) so that's the one that gets picked. The compiler doesn'tconsider the Parent method at all.

The reason for this is to reduce the risk of the brittle base classproblem...

More from Eric Lippert

As the standard says, “methods in a base class are not candidates if any method in a derived class is applicable”.

In other words, the overload resolution algorithm starts by searchingthe class for an applicable method. If it finds one then all the otherapplicable methods in deeper base classes are removed from thecandidate set for overload resolution. Since Delta.Frob(float) isapplicable, Charlie.Frob(int) is never even considered as a candidate.Only if no applicable candidates are found in the most derived type dowe start looking at its base class.

如果我们用这个从 A 派生的附加类扩展您问题中的示例,事情会变得更有趣:

class C : A {
public void Abc(byte b) {
Console.Write("C");
}
}

如果我们执行下面的代码

int i = 1;
b.Abc((int)1);
b.Abc(i);
c.Abc((int)1);
c.Abc(i);

结果是 BBCA。这是因为对于 B 类,编译器知道它可以隐式地将 any int 转换为 double。对于 C 类,编译器知道它可以将文字 int 1 转换为一个字节(因为值 1 适合一个字节),因此使用了 C 的 Abc 方法。但是,编译器不能将任何旧的 int 隐式转换为字节,因此 c.Abc(i) 不能使用 C 的 Abc 方法。在这种情况下,它必须使用父类。

This page on Implicit Numeric Conversions显示了一个紧凑的表,其中数字类型可以隐式转换为其他数字类型。

关于c# - 为什么 C# 编译器使用无效方法的重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35328471/

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