为什么C#中的foreach以这种方式运行,是否有一种方法可以在未来得到修复?

cod*_*nix -1 .net c# type-conversion

long[] b = new long[1];
int i1 = b[0]; // compile error as it should

// no warning at all, large values gets converted to negative values silently
foreach (int i2 in b) 
{
}

class Customer : Person{}
Person[]p = new Person[]{mypers};

// no warning at all, throws typecastexception at runtime
foreach (Customer c in p) 
{
}
Run Code Online (Sandbox Code Playgroud)

我知道他们不能简单地修复它,因为它会破坏现有的程序.

但是为什么他们不在c#编译器中创建一个兼容性选项,我可以打开类型安全的foreach块生成,至少对于我确信它有效的新程序或程序?

jal*_*alf 17

foreach (var c in p) 
{
}
Run Code Online (Sandbox Code Playgroud)

很好地避免了这个问题,不是吗?

  • 在任何地方使用"var"都不会使程序更容易阅读. (3认同)

Jus*_*ner 6

foreach 是唯一可行的方式.

foreach对集合迭代,它并不一定知道将要返回的任何类型(可以通过接口实现的集合,或只是一个对象在较旧的.NET"袋"风格集合的情况下).

考虑这个例子:

var bag = new ArrayList();
bag.Add("Some string");
bag.Add(1);
bag.Add(2d);
Run Code Online (Sandbox Code Playgroud)

foreach在这个实例中表现如何(集合有一个字符串,一个int和一个double)?您可以强制foreach迭代最兼容的类型,在本例中为Object:

foreach(object o in bag)
{
    // Do work here
}
Run Code Online (Sandbox Code Playgroud)

有趣的是,使用var将完全如此:

foreach(var o in bag)
{
    // o is an object here
}
Run Code Online (Sandbox Code Playgroud)

但是对象的成员不会真正允许你做任何有用的事情.

做任何有用的事情的唯一方法是依靠开发人员指定他们想要使用的确切类型,然后尝试强制转换为该类型.