为什么要编译隐藏的重载?
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 中指定的方法解析规则:
我在大学里教 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 中指定的方法解析规则: