【发布时间】:2012-12-11 17:12:34
【问题描述】:
有人愿意解释一下这段代码是如何产生以下输出的吗?
using System;
namespace ConsoleApplication1
{
class Test
{
public override string ToString() { return "ToString override"; }
public string ToString(string optional = "")
{ return String.Format("ToString with optional parameter {0}", optional); }
}
class Test2
{
public new string ToString() { return "ToString new"; }
public string ToString(string optional = "")
{ return String.Format("ToString with optional parameter {0}", optional); }
}
class Program
{
static void Main(string[] args)
{
Test one = new Test();
Test2 two = new Test2();
Console.WriteLine(one);
Console.WriteLine(one.ToString());
Console.WriteLine(one.ToString("foo"));
Console.WriteLine("--");
Console.WriteLine(two);
Console.WriteLine(two.ToString());
Console.WriteLine(two.ToString("bar"));
Console.ReadKey();
}
}
}
ToString 覆盖
带有可选参数的ToString
带有可选参数 foo 的 ToString
--
ConsoleApplication1.Test2
ToString 新
带有可选参数 bar 的 ToString
【问题讨论】:
-
哪一行不明白? (详细介绍它们会很乏味。)
-
基本上编译器如何在不同的方法之间进行选择,因为它们具有相同的签名。
-
他们没有相同的签名...再说一次,如果你说 which 你被困在上面,那会有所帮助。您有多少尝试了解重载解决方案的工作原理?顺便说一句,没有 C# 4.5 这样的东西。
-
规范中写的。
-
关于
Console.WriteLine(one)和Console.WriteLine(two)的部分相当简单。Console.WriteLine()接受一个对象。你的Test类覆盖ToString(),所以你得到一个相当明显的结果。Test2不会覆盖ToString(),并且由于WriteLine正在寻找object,它没有找到new string ToString()函数。
标签: c# inheritance optional-parameters overriding