只是出于好奇,为什么编译器会将一个无约束的泛型类型与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类型会导致编译错误。而将“object类型的thing”转换为Bar类型是可以通过编译的,当然这样做存在风险。
我不明白的是原因所在。毕竟,在.NET中,object类型是一个万能类型,运行时类型可以是任何类型的装箱值或对象。因此,我不明白为什么编译器要区分这两种情况。我只能说,“程序员希望编译器对泛型类型进行类型检查,但不希望对object类型进行检查”。 :) 这就是全部原因吗?
顺便说一下,我知道在Foo的情况下,我仍然可以通过编写以下内容来完成类型转换:
((Bar)(object)thing).ToString();
我只是想了解编译器为什么会这样做...
int
强制转换为Bar
在编译时是否合法?当使用int
填充类型参数时,是否应该开始出现编译器错误?如果程序集不是您的,则无法看到问题。T不是对象,而是非常具体的东西。 - Anthony Pegramclass Foo<T> where T : Bar
来_确保_T
始终可以转换为Bar
? - Rawlingobject
进行此类转换时引发编译时错误。 - Damien_The_Unbeliever