只是出于好奇,为什么编译器对待不受约束的泛型类型与 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 是编译器允许我做的事情,当然风险自负。
我不明白为什么。毕竟在 .net 中的对象是一个包罗万象的对象,运行时类型可以是装箱的值或任何类型的对象。所以我看不出编译器有什么逻辑理由来区分这两种情况。我能做的最好的事情是“程序员希望编译器对泛型类型进行类型检查,而不是对对象进行类型检查”。:) 这就是它的全部内容吗?
顺便说一句,我知道我仍然可以在 Foo 案例中完成我的演员表,只需编写
((Bar)(object)thing).ToString();
我只是想了解为什么编译器会这样做......