Почему "someString + = AnotherString = someString;" действительный в С#
Я писал код сегодня и был в середине линии, когда я нажал на экран на другом мониторе, чтобы что-то проверить. Когда я оглянулся назад, ReSharper окрасил 3-ю строку ниже серого с запиской "Назначенное значение не используется в любом пути выполнения".
var ltlName = (Literal) e.Item.FindControl("ltlName");
string name = item.FirstName;
name +=
ltlName.Text = name;
Я был в замешательстве; этот код не может компилироваться. Но это так, и он тоже работает. Строка "name + =" не влияет (что я могу сказать) на строку. Что здесь происходит?
(Visual Studio 2008,.NET 3.5)
Ответы
Ответ 1
Он делает это:
name += ltlName.Text = name;
или сделать это несколько яснее:
name += (ltlName.Text = name);
Результатом установки свойств является значение, которое было установлено, поэтому оно немного похоже на это:
string tmp = name;
ltlName.Text = tmp;
name += tmp;
Проще заметить это, когда у вас есть разные переменные, и просто просто назначение как конечный шаг, а не сложное назначение. Вот полный пример:
using System;
class Test
{
public string Text { get; set; }
static void Main()
{
Test t = new Test();
string x = t.Text = "Hello";
Console.WriteLine(x); // Prints Hello
}
}
Простые правила назначения (раздел 7.17.1) используются для определения результата выражения:
Результат простого назначения выражение - это значение, присвоенное левый операнд. Результат имеет тот же тип, что и левый операнд, и всегда классифицируется как значение.
Таким образом, тип ltlName.Text = name
- это тот же тип, что и ltlName.Text
, и это значение присваивается. Тот факт, что это свойство, а не поле или локальная переменная, не меняет этого.
Ответ 2
Обратите внимание, что в С# символы перевода не являются особыми. Из-за следующей строки полная инструкция для компилятора
name += ltlName.Text = name;
который является допустимым оператором (он присваивает name
ltlName.Text
, а затем добавляет его к name
.)
Ответ 3
В С# строки новой строки не завершают утверждения - только точки с запятой. Таким образом выполняется следующая строка кода:
name += ltlName.Text = name;
Ответ 4
Поскольку пробел не имеет значения в С#, строки 3, 4 и 5 образуют одно утверждение:
name += ltlName.Text = name;
Ответ 5
Как и ожидалось, результатом является имя, связанное с самим собой. Таким образом, вы получаете "namename".
obj.Text - это просто свойство, поэтому строка заканчивается преобразованием в
//name += obj.Text = name;
obj.setText(name);
name += obj.Text;
Полный источник ниже
public class Program
{
public static void Main(string[] args)
{
MyClass obj = new MyClass();
string name = "name";
name += obj.Text = name;
Console.Write(name); //prints namename
}
}
Ответ 6
Это влияет на строку, но только после того, как строка используется для воздействия на литерал на дисплее. Как указывал KennyTM, обе строки образуют единый оператор. В отличие от VB, возврат каретки не заканчивается на С#. Точка с запятой. Итак, что происходит здесь, строка задается в литеральном, и результат этой операции ( "правда", возможно, или просто сама строка? Я не помню) добавляется к строке.