只是出于好奇,为什么编译器将一个不受约束的泛型类型与它的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