Подтвердить что ты не робот

Почему "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)

4b9b3361

Ответ 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, возврат каретки не заканчивается на С#. Точка с запятой. Итак, что происходит здесь, строка задается в литеральном, и результат этой операции ( "правда", возможно, или просто сама строка? Я не помню) добавляется к строке.