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)
{
}
Я знаю, что они не могут просто исправить это, потому что это нарушит существующие программы.
Но почему они не делают параметр совместимости в компиляторе С#, где я могу включить генерацию блока foreach с безопасным типом, по крайней мере, для новых программ или программ, где я уверен, что это работает?
foreach
специфически? Проблема не имеет ничего общего сforeach
. Именно система типов C# в целом допускает определенные преобразования. Это происходит потому, что в некоторых случаях они полезны. - person jalf   schedule 06.08.2010foreach
не работает в C#. Ваше понимание того, что он должен делать. Я мог бы вызвать такое же поведение в ваших одиночных присваиваниях, эмулируя то, что происходит в оператореforeach
:int i1 = (int) b[0];
илиCustomer c = (Customer)p[0];
. Указав тип в оператореforeach
, вы говорите компилятору явно привести каждый элемент к желаемому типу, и он просто слушает вас. - person Justin Niessner   schedule 06.08.2010