为什么隐藏的重载正在编译?

时间:2018-05-21 15:41:12

标签: c# syntax overloading constructor-overloading

我正在教我的学院 c#,一般来说, OOP ,在一堂课中我对这段代码感到困惑。从语法的角度来看显然是正确的。

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#有什么意义?

1 个答案:

答案 0 :(得分:2)

我认为对你的问题的简单回答是,在C#的历史中,方法重载出现在默认参数之前。所以,曾经有一段时间支持像Print这样的方法,无论有没有参数,都会有2次重载

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

沿着默认参数,你可以选择只有一个

void(bool uppercase = false)

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

运行时具有本QA中指定的方法解析规则:Method Overloading with Optional Parameter