從這個問題why does n.GetHashCode() work but n.GetType() throws and exception?即將答案喬恩送給促使我這樣一個問題:爲什麼不Nullable<>
隱藏GetType
:爲什麼Nullable <>不隱藏GetType?
public new Type GetType()
{
return GetValueOrDefault().GetType();
}
因爲那麼這
int? i = null;
Console.WriteLine(i.GetType().Name);
應該工作,不應該嗎?我錯過了明顯的東西嗎?什麼是警告?我試過谷歌,但沒有找到任何令人滿意的解釋。
更新:澄清:有點。這工作:
int? i = null;
Console.WriteLine(i.GetHashCode());
爲什麼i.GetType()
拋出的唯一原因是因爲GetType
不是虛擬的,不能被重寫。所以當調用它時,i
被裝箱到對象中,導致null
然後拋出。但是,如果Nullable
會這樣
public struct Nullable<T> where T : struct
{
....
public new Type GetType()
{
return GetValueOrDefault().GetType();
}
}
來實現,那麼這將使得行爲更加一致(恕我直言)的問候,所有這一切會工作,而不是僅僅前兩個電話:
int? i = null;
Console.WriteLine(i.GetHashCode());
Console.WriteLine(i.ToString());
Console.WriteLine(i.GetType());
你會如何隱藏一個繼承自Object的方法? – Kevin 2011-04-05 09:21:22
此外,你爲什麼要? – 2011-04-05 09:27:42
是的,的確,爲什麼'null.GetType()'拋出空引用異常:) – Poma 2011-04-05 09:55:35