validar asociativo array c#

validar - array asociativo c#



¿Cómo se comporta el asociativo correcto del operador coalescente nulo? (4)

Ambos funcionan como se espera y son efectivamente idénticos porque las expresiones involucran tipos simples (gracias @Jon Skeet). Se encadenará al primer no nulo de izquierda a derecha en sus ejemplos.

La precedencia (gracias @Ben Voigt) es más interesante cuando se combina este operador con operadores de diferente precedencia :

value = A ?? B ? C : D ?? E;

Básicamente, la asociatividad se expresa inherentemente a través de la precedencia del operador o a través de sub-expresiones introducidas por el usuario (paréntesis).

El operador de unión nula es asociativo a la derecha, lo que significa una expresión de la forma

primero ?? segundo Tercero

se evalúa como

primero ?? (segundo Tercero)

Basado en la regla anterior, creo que la siguiente traducción no es correcta.

De:

Address contact = user.ContactAddress; if (contact == null) { contact = order.ShippingAddress; if (contact == null) { contact = user.BillingAddress; } }

A:

Address contact = user.ContactAddress ?? order.ShippingAddress ?? user.BillingAddress;

En cambio, creo que el siguiente es correcto (corríjame si me equivoco)

Address contact = (user.ContactAddress ?? order.ShippingAddress) ?? user.BillingAddress;


La especificación es en realidad auto-contradictoria en este caso.

La sección 7.13 de la especificación C # 4 establece:

El operador de unión nula es asociativo a la derecha, lo que significa que las operaciones se agrupan de derecha a izquierda. Por ejemplo, una expresión de la forma a ?? b ?? c a ?? b ?? c a ?? b ?? c se evalúa como a ?? (b ?? c) a ?? (b ?? c) .

Por otro lado, como se ha señalado, 7.3.1 afirma que:

A excepción de los operadores de asignación, todos los operadores binarios son asociativos a la izquierda

Estoy totalmente de acuerdo en que para los casos simples no importa cómo se realice la agrupación ... pero puede haber casos en los que realmente importa debido a que las conversiones de tipos implícitas hacen cosas interesantes si los operandos tienen tipos diferentes.

Lo consideraré aún más, haga ping a Mads y Eric, y agregaré un error para la sección relevante de C # en profundidad (que inspiró esta pregunta).

EDIT: De acuerdo, ahora tengo un ejemplo en el que importa ... y el operador de unión nula es definitivamente correcto -asociativo, al menos en el compilador MS C # 4. Código:

using System; public struct Foo { public static implicit operator Bar(Foo input) { Console.WriteLine("Foo to Bar"); return new Bar(); } public static implicit operator Baz(Foo input) { Console.WriteLine("Foo to Baz"); return new Baz(); } } public struct Bar { public static implicit operator Baz(Bar input) { Console.WriteLine("Bar to Baz"); return new Baz(); } } public struct Baz { } class Test { static void Main() { Foo? x = new Foo(); Bar? y = new Bar(); Baz? z = new Baz(); Console.WriteLine("Unbracketed:"); Baz? a = x ?? y ?? z; Console.WriteLine("Grouped to the left:"); Baz? b = (x ?? y) ?? z; Console.WriteLine("Grouped to the right:"); Baz? c = x ?? (y ?? z); } }

Salida:

Unbracketed: Foo to Baz Grouped to the left: Foo to Bar Foo to Bar Bar to Baz Grouped to the right: Foo to Baz

En otras palabras,

x ?? y ?? z

se comporta igual que

x ?? (y ?? z)

pero no es lo mismo que

(x ?? y) ?? z

Actualmente no estoy seguro de por qué hay dos conversiones de Foo a Bar al usar (x ?? y) ?? z (x ?? y) ?? z - Necesito verlo más cuidadosamente ...

EDIT: Ahora tengo otra pregunta para cubrir la doble conversión ...


La respuesta de Jon es correcta.

Solo para ser claros: el ?? El operador en C # es asociativo a la derecha . Acabo de pasar por el analizador del operador binario y he verificado que el analizador se trata. como asociativo de derecho.

Como Jon señala, la especificación dice que el ?? el operador es asociativo por la derecha, y todos los operadores binarios excepto la asignación son asociativos por la izquierda. Como la especificación se contradice a sí misma, claramente solo una de estas puede ser correcta. Tendré la especificación enmendada para decir algo como:

Excepto por la asignación simple, la asignación compuesta y los operadores de unión nula, todos los operadores binarios son asociativos a la izquierda


No puedo ver lo que importa, tanto:

(a ?? b) ?? c

y

a ?? (b ?? c)

tienen el mismo resultado!