为什么要编译隐藏的重载?

Why hidden overload is compiling at all?

我在大学里教 c#,总的来说,OOP,在 class 期间我很困惑通过这段代码。从句法的角度来看显然是正确的。

using System;

namespace ConstructorTest
{
    public class Character
    {
        private readonly string _state;
        public Character(char a)
        {
            _state = "First constructor: " + a;
        }
        public Character(char a, bool uppercase = false)
        {
            _state = "Second constructor: " + (uppercase ? Char.ToUpper(a) : a);
        }

        public override string ToString()
        {
            return _state;
        }

        public static void Print()
        {
            Console.WriteLine("First print");
        }

        public static void Print(bool uppercase = false)
        {
            string text = "Second print";
            Console.WriteLine(uppercase ? text.ToUpper() : text);
        }
    }

    class Program
    {
        private static void Main()
        {
            Console.WriteLine(new Character('a'));
            Console.WriteLine(new Character('A'));
            Console.WriteLine(new Character('a', true));
            Console.WriteLine(new Character('A', true));
            Console.WriteLine();
            Character.Print();
            Character.Print(true);
        }
    }
}

我的意思是理解要调用哪个函数没有问题

Character.Print(true)

但是Character.Print()有两种解释

输出

First constructor: a
First constructor: A
Second constructor: A
Second constructor: A

First print
SECOND PRINT

所以我的问题是 - c# 允许隐藏构造或函数重载的要点是什么?

我认为对您的问题的简单回答是,在 C# 的历史中,方法重载出现在默认参数之前。因此,曾几何时,要支持像 Print 这样有或没有参数的方法,您将有 2 个重载

void Print(){Print(false);}
void Print(bool uppercase){...}

伴随而来的是默认参数,您可以选择只使用一个

void(bool uppercase = false)

但是由于历史原因,重载仍然存在,因为您可以拥有比默认参数所能提供的更复杂的重载功能。

运行时具有此 QA 中指定的方法解析规则: