Рассмотрим следующий код C #.
string[] stringArray = new string[10];
foreach (string s in stringArray)
s = "a new string"; // Compiler error - Can't assign to foreach iteration variable
Теперь рассмотрим следующий действительный код C ++ / CLI.
array<String^>^ stringArray = gcnew array<String^>(10);
for each(String^% s in stringArray)
s = "a new string";
Когда foreach
используется с типом массива, компилятор переводит его в обычный цикл for
. Эта реализация одинакова для C # и C ++ / CLI. Поэтому мне интересно, может ли C ++ / CLI разрешить это, почему не компилятор C #?
Эта ошибка имеет смысл, когда тип не является массивом, так как foreach
будет скомпилирован в вызов GetEnumerator
и будет использовать перечислитель для итерации. Но я думаю, что это может быть разрешено для типов массивов.
Есть мысли?
В качестве примечания ниже приведен также допустимый код C ++ / CLI, но он не даст ожидаемого результата.
List<String^>^ stringList = gcnew List<String^>(10);
for each(String^% s in stringList)
s = "a new string"; // I think this should be prevented by compiler as it makes no sense.