В С# я не могу неявно преобразовать long
в int
.
long l = 5;
int i = l; // CS0266: Cannot implicitly convert type 'long' to 'int'. An explicit conversion exists (are you missing a cast?)
Это вызывает указанную ошибку. И это правильно; если я это сделаю, я рискую сломать свои данные из-за ошибочного усечения. Если я решаю, что я знаю, что делаю, тогда я всегда могу сделать явное приведение и сказать компилятору, что все в порядке, чтобы усечь, я знаю лучше всего.
int i = (int)l; // OK
Однако такой же механизм не применяется при использовании цикла foreach
.
IList<long> myList = new List<long>();
foreach (int i in myList)
{
}
Компилятор даже не генерирует предупреждение здесь, хотя это, по сути, одно и то же: непроверенное усечение long
на int
, что может очень сильно нарушить мои данные.
Итак, мой вопрос просто: почему этот foreach
не создает ту же ошибку, что и присвоение переменной?