2011-02-03 69 views
3

如果我有下面的代碼泛型類型推斷如何在C#中工作?

private BaseMessage getMessage() 
{ 
    return new OtherMessage(); 
} 

private void CheckType<T>(T type) 
{ 
    Console.WriteLine(type.GetType().ToString()); 
    Console.WriteLine(typeof(T).ToString()); 
} 

private void DoChecks() 
{ 
    BaseMessage mess = getMessage(); 
    CheckType(mess); 
} 

,爲什麼我會不同類型的輸出?無論如何都得到類型推斷來使用傳遞的對象的實際類型?

+0

可以添加Console.WriteLine的輸出嗎? – 2011-02-03 10:38:41

+1

你會得到什麼輸出?你期望的輸出是什麼? – 2011-02-03 10:40:32

回答

6

泛型類型推斷意味着編譯器自動解析傳遞參數的類型,而不需要顯式指定要傳遞的類型。這意味着這是在編譯時完成的:在你的代碼中,在編譯期間,編譯器只知道BaseMessage,因此參數將作爲BaseMessage傳遞。在運行期間,參數的實際類型將是OtherMessage,但這與編譯器無關。

因此,你得到的輸出是絕對有效的。除了始終使用Object.GetType而不是typeof()之外,我不知道有任何方法可以解決此問題。

5

原因是您已聲明變量mess的類型爲BaseMessage。所以當你問這個類型時,它會返回BaseMessage

這是GetTypetypeof表現的方式之間的區別。 GetType在運行時返回實際對象的類型,如果涉及繼承(可能與您的示例中的情況相同),該類型可能與引用對象的變量的類型不同。與GetType不同,typeof編譯時間上解析爲指定的確切類型的類型文字。

public class BaseMessage { } 

public class OtherMessage : BaseMessage { } 

private BaseMessage getMessage() 
{ 
    return new OtherMessage(); 
} 

private void CheckType<T>(T type) 
{ 
    Console.WriteLine(type.GetType().ToString()); // prints OtherMessage 
    Console.WriteLine(typeof(T).ToString());  // prints BaseMessage 
} 

private void DoChecks() 
{ 
    BaseMessage mess = getMessage(); 
    CheckType(mess); 
} 

您必須爲工作選擇正確的工具。當您想要在編譯時獲取類型時,請使用typeof。當您想要獲取對象的運行時類型時,請使用GetType