下面我們對第二種 情況的代碼做一些變化,代碼如下:
using System;
using System.Collections.Generic;
using System.Text;
namespace OverrideDemo
{
/// <summary>
/// 說明:本實例用於講 述重載的關系
/// 作者:周公
/// 日期:2008-09-04
/// 首發地址:http://blog.csdn.Net/zhoufoxcn
/// </summary>
class Program
{
static void Main(string[] args)
{
Show(null);
Show("");
Show(1);
}
static void Show(string s)
{
Console.WriteLine("String");
}
static void Show(Object o)
{
Console.WriteLine("Object");
}
static void Show(Program p)//Program是當前方法所在的類
{
Console.WriteLine("Program");
}
}
}
上面的代碼的運行結果是什麼,你能猜出來嗎?
哈哈,上面的程序代 碼是沒有運行結果的,因為它沒有辦法編譯!編譯情況如下:
為什麼不能通過編譯呢 ?
原因就出在Show(null)這個方法這裡!如果僅僅有static void Show(string s)和 static void Show(Object o)方法構成重載關系,那麼null我們既可以理解為空string引用 也可以理解為空Object引用,因為string類型的限制更精確一些,所以C#會按照最精確地匹 配成string類型,因而會執行static void Show(string s)這個方法。這是在前面的代碼中 已經被證明的。可是現在多了一個static void Show(Program p)方法的重載,null既可以理 解成空string類型引用,也可以理解成空Program類型引用,因為string類和Program類都是 Object類的派生類,所以按照前面的推論自然不會當成空Object類型的引用。因為String類 和Program類之間不存在繼承關系,按照最精確匹配原則,編譯器無法決定匹配成String類還 是Program類最精確,所以編譯無法通過。
附注:最近嘗試將一些比較基礎的理論的 知識用比較淺顯的話語表達出來,主要是為了方便初學者理解和學習,也許某些詞語用得不 夠professional,,但是如果詞語太professional了怕初學者理解起來有困難,敬請各位大 俠諒解,因為本文不是為你們寫的。同時也歡迎各位與我交流經驗和心得。最近垃圾郵件太 多,所以不便在這裡公開我的email,如果各位有興趣與我交流,請加我為csdn好友,這樣就 能看見我的QQ和email了.