2010-09-02 21 views
16

Estaba escribiendo un código hoy y estaba en la línea media cuando seleccioné una pestaña en una pantalla en mi otro monitor para verificar algo. Cuando miré hacia atrás, ReSharper había coloreado la tercera línea debajo de gris con la nota "El valor asignado no se usa en ninguna ruta de ejecución".¿Por qué es "someString + = AnotherString = someString;" válido en C#

var ltlName = (Literal) e.Item.FindControl("ltlName"); 
string name = item.FirstName; 
name += 

ltlName.Text = name; 

I was confused; seguramente este código no puede compilarse. Pero lo hace, y funciona también. La línea "nombre + =" no tiene ningún efecto (que yo pudiera decir) en la cadena. ¿Que está pasando aqui?

(Visual Studio 2008, .NET 3.5)

+7

tiene dos monitores, Show-off .... – Omar

+0

1 para publicar todo el código relevante para su pregunta, sin una línea más o menos. – Task

+0

@Baddie, yo también. Probablemente agregando un tercero. Solo porque. – jlafay

Respuesta

19

Se está haciendo esto:

name += ltlName.Text = name; 

o para que sea un poco más claro:

name += (ltlName.Text = name); 

El resultado de la incubadora propiedad es el valor que se estableció, por lo que funciona un poco como esto:

string tmp = name; 
ltlName.Text = tmp; 
name += tmp; 

Es más sencillo de observar esto cuando tienes diferentes variables que intervienen sin embargo, y la asignación simplemente simple como el paso final en lugar de una asignación compuesta. Aquí está un ejemplo completo:

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 
    } 
} 

Los simples de asignación reglas (sección 7.17.1) se utilizan para determinar el resultado de la expresión:

El resultado de una asignación simple expresión es la valor asignado a el operando de la izquierda. El resultado tiene el mismo tipo que el operando de la izquierda y es siempre clasificado como un valor.

lo tanto, el tipo de ltlName.Text = name es del mismo tipo que ltlName.Text, y el valor es el que ha sido asignado. El hecho de que sea una propiedad en lugar de un campo o una variable local no cambia esto.

+0

¿No crearía la concatenación algo más parecido a namename? ¿O el orden de las operaciones cancela el concat? –

+0

@Joel: No, todavía se está realizando la concatenación; la versión de asignación fue solo para simplificar las cosas. Editará para aclarar. –

+1

@Jon Skeet: en su aclaración, ¿no debería ser cadena x + = t.Text = "Hola"; (por OP) y ¿el resultado de esa línea no sería "HelloHello"? –

24

en cuenta que los saltos de línea no son especiales en C#. Debido a la siguiente línea, la declaración completa al compilador es

name += ltlName.Text = name; 

que es una declaración válida (que asigna name a ltlName.Text, tiene que poner a name.)

+1

Exactamente. Eso se expande (aproximadamente) a: 'ltlName.Text = name; name = name + ltlName.Text; '. * That * es equivalente a 'ltlName.Text = name; name = name + name; ' – Randolpho

+0

Eso tiene sentido ... Lo probé con este código en otro lugar: string x =' "This is a string!"; MessageBox.Show (x); x + = MessageBox.Show (x); ' Pero eso también" oculta "la tarea que me faltaba. ¡Gracias! –

5

En C#, las nuevas líneas no terminan las instrucciones, solo lo hacen los puntos y coma. Así que la siguiente línea de código se está ejecutando:

name += ltlName.Text = name; 
1

Debido a que el espacio en blanco es irrelevante en C#, línea 3, 4 y 5 forman una sola declaración:

name += ltlName.Text = name; 
0

está afectando a la cadena, pero no hasta después la cadena se usa para afectar el literal en la pantalla. Como KennyTM señaló, ambas líneas forman una sola declaración. A diferencia de VB, el retorno de carro no termina una declaración en C#. El punto y coma sí. Entonces, ¿qué está pasando aquí es que la cadena se está configurando en el literal y el resultado de esa operación ("verdadero" quizás?o solo la cadena en sí? No recuerdo) está siendo agregado a la cadena.

1

Como se esperaba, el resultado es un nombre concatenado a sí mismo. Entonces obtienes "namename".

obj.Text es sólo una propiedad, por lo que la línea termina por convertir a

//name += obj.Text = name; 
obj.setText(name); 
name += obj.Text; 

fuente completo a continuación

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 
    } 
} 
Cuestiones relacionadas