只是出於好奇,爲什麼編譯器將一個不受約束的泛型類型與它的typeof(object)不同?泛型和類型約束的規則
class Bar { }
class Foo
{
void foo(object thing)
{
((Bar)thing).ToString();
}
}
class Foo<T>
{
void foo(T thing)
{
((Bar)thing).ToString();
}
}
在上面,將「T thing」強制轉換爲Bar會導致編譯器錯誤。然而,向Bar提供「object thing」是編譯器允許我做的事情,當然,我自己承擔風險。
我不明白的是爲什麼。在.net對象中,所有內容都是全部捕獲的,而運行時類型可能是盒裝值或任何類型的對象。所以我看不出有什麼合乎邏輯的理由讓編譯器區分這兩種情況。我能做的最好的事情就像「程序員希望編譯器使用泛型類型進行類型檢查,但不使用對象」。 :)這一切都有它嗎?
順便說一句,我知道我還可以得到我的演員在美孚的情況下完成的,通過寫
((Bar)(object)thing).ToString();
我只是想了解爲什麼編譯器做到這一點...
編譯時間是否合法將'int'轉換爲'Bar'?當你用'int'填充那個類型參數時,它應該*然後*開始有編譯器錯誤嗎?如果裝配不是你的,那你怎麼看不出問題呢? T不是客體。這是非常具體的東西。 – 2013-02-15 14:12:09
你是否也知道你可以說'Foo其中T:Bar'來保證'T'總是可以投射到'Bar'? –
Rawling
2013-02-15 14:12:12
我確信Eric Lippert在這個地方有一篇博客文章,但我找不到它...... – 2013-02-15 14:13:57