Her*_*des -2 .net c# implicit-cast
只是想了解C#.仅考虑以下简化示例.
void Main()
{
IList<IAnimal> animals = new List<IAnimal>
{
new Chicken(),
new Cow(),
};
// Shouldn't this line result in a compile-time error?
foreach (Chicken element in animals)
{
}
}
public interface IAnimal
{
}
public class Cow : IAnimal
{
}
public class Chicken : IAnimal
{
}
Run Code Online (Sandbox Code Playgroud)
虽然第一次迭代成功,但第二次迭代不成功.老实说,我预计这会在编译时失败.有谁理解为什么它只在运行时失败?
因为该foreach语句在C#语言规范中定义为具有(隐藏)显式强制转换:
上述步骤,如果成功,则明确地生成集合类型C,枚举器类型E和元素类型T.表单的foreach语句
foreach (V v in x) embedded-statement
Run Code Online (Sandbox Code Playgroud)
然后扩展到:
{
E e = ((C)(x)).GetEnumerator();
try {
while (e.MoveNext()) {
V v = (V)(T)e.Current;
embedded-statement
}
}
finally {
… // Dispose e
}
}
Run Code Online (Sandbox Code Playgroud)
(注意(V)(T)e.Current,"显式"强制转换为类型V)
这是不幸的是,像这样定义,因为这是你真的是需要在C#1(之前仿制药,在每一个集合你想要在一个迭代foreach是集合object)和,现在,为了向下兼容,不能更改.