2013-03-01 6 views
3

Вот код в VB.NetForeach петля VB.Net в C# код преобразования

If Not queryItems Is Nothing Then 
       For Each qItem As String In queryItems 
        qItem = qItem.ToLower() 
       Next 
End If 

и это "эквивалент" код в C# (с использованием преобразователя SharpDevelop/developerfusion/Telerik в/VS 2012 "вставить в C#" метод)

if (queryItems != null) 
{ 
    foreach (string qItem in queryItems) 
    { 
     qItem = qItem.ToLower(); 
    } 
} 

C# компилятор (справедливо) жалуется на следующую

"Cannot assign to 'qItem' because it is a 'foreach iteration variable'" 

Я задаюсь вопросом, почему такое поведение р ermitted в VB.Net?

+0

вы можете найти информацию об этом в [здесь] (http://stackoverflow.com/questions/ 7838079/why-cant-we-assign-a-foreach-iteration-variable-while-we-can-full-modi) –

+2

Неясно, чего ожидалось в версии VB - наверняка, на самом деле это не было бы «сохранить» версию нижнего регистра обратно в оригинальную коллекцию, не так ли? –

+0

Помогает ли это? http: // stackoverflow.com/questions/2037988/change-foreach-итерация-переменная-и-реализация-различия-между-c-sha – as1

ответ

1

Вполне разумно, чтобы каждая строка в (массив? Список?) Была помещена в нижний регистр в цикле.

SUGGESTION: просто использовать старый добрый "для()" петля -

// Assuming array syntax... 
if (queryItems != null) 
{ 
    for (int i=0; i < queryItems.Length; i++) 
    { 
     queryItems[i] = queryItems[i].ToLower(); 
    } 
} 

ИМХО ...

PS: Я не уверен, если версия VB.Net фактически никогда не работал как предполагалось. Вы знаете?

+0

Я не обращал внимания на логику или то, что она делала - чтение и внесение изменений в vb занимало больше времени, поэтому я решил преобразовать этот класс. на этот раз меня больше интересовала особенность языка – Sekhar

+0

Версия VB.NET работает так, как ожидалось, только что протестирована в VS 2010. – Neolisk

2

Суть вопроса, как представляется, это

Я задаюсь вопросом, почему это поведение разрешается в VB.Net?

Лучше вопрос может быть следующим

Почему C# предотвратить присвоение переменной итерации?

Если вы посмотрите на набор конструкций lopping и языков C#, это нечетный шар здесь. Практически в каждом другом случае (даже в Java foreach) законно присваивать переменной итерации цикла. Единственные случаи I`m в курсе являются

  • F #: Переменные только для чтения по умолчанию, хотя, так что это просто согласованность с остальной частью языка
  • Ada: Запрещает присвоение обхвата значения в for отчетности

VB.Net на самом деле более согласован здесь с нормой, чем C#.

К сожалению, пока неясно, почему C# сделал этот выбор. Есть много спекулятивных ответов, но пока Эрик или Андерс не опубликуют сообщение в блоге, настоящая причина останется неизвестной.

+0

Я использовал для программирования на Java - но по какой-то причине я всегда думал, что переменные итерации не могут быть переназначается .. спасибо за ваш вклад! – Sekhar