2008-11-19 20 views
6
  1. ¿Por qué el operador '&' está definido para bool ?, y el operador '& &' no?
  2. ¿Cómo funciona esto 1) bool? & bool? y 2) bool? y bool funcionan?

Cualquier otra semántica de operador "interesante" en Nullable? ¿Hay operadores sobrecargados para T genérico?Nullable <T>: y operadores sobrecargados, bool? & bool

Respuesta

11

los operadores en Nullable<T> son operadores "levantados". Lo que esto significa es: si T tiene el operador, T? tendrá la contraparte "levantada".

& & y || no son realmente operadores en el mismo sentido que & y | - por ejemplo, no pueden ser sobrecargados - a partir de la especificación ECMA sobrecarga 14.2.2 Operador:

Los operadores binarios sobrecargable son: + - * /% & |^< < >> ==! => <> = < = Solo los operadores enumerados anteriormente pueden estar sobrecargados. En particular, no es posible sobrecargar el acceso de miembros, invocación de métodos, o los =, & &, ||, ??,?:, Comprobado, sin control, nueva, typeof, como, y es operadores.

Del mismo modo, a partir de la especificación ECMA, 14.2.7 operadores levantada, los operadores son levantadas:

Para los operadores unitarios + ++ - -! ~

Para los operadores binarios + - * /% & |^< < >>

Para los operadores de igualdad ==!=

Para los operadores relacionales <> < => =

Así que, básicamente, los operadores de cortocircuito no se definen como operadores levantadas.

[editar: añadido hoja de cuna]

  • operador levantada: un compilador proporcionado operador en Nullable<T>, en base a los operadores de T - por ejemplo: el operador int "+" se "levantado" en int? , definido como:

    (int? x, int? y) => (x.HasValue & & y.HasValue)? (x.Value + y.Value): (int?) null;

  • Sobrecarga del operador: el acto de proporcionar una implementación de operador personalizado para un tipo dado; por ejemplo decimal y DateTime proporcionan diversos operador sobrecarga

  • corto-circuito: el comportamiento normal de && y || (en muchos idiomas, incluyendo C++ y C#) - es decir, el segundo operando no podría ser evaluado - es decir

    (expresión1, expresión2) => expresión1()? expression2(): falso;

O tal vez un ejemplo más simple:

bool someFlag = Method1() && Method2(); 

si Method1() vuelve falsa, entonces Method2() no se ejecuta (ya que el compilador ya sabe que la respuesta general es falsa). Esto es importante si Method2() tiene efectos secundarios, ya que como guardar en la base de datos ...

+0

Gracias. Sin embargo, después de C++, toda esta terminología ... cortocircuito, levantado ... imposibilidad de anular && ... suena bastante extraño para mí :) – badbadboy

+0

Agregaré una hoja de cuna ;-p –

+0

@Marc Gravell: gracias !! – badbadboy

1

El operador "&" es un operador bit a bit, "& &" es un operador lógico. El operador "AND" logcial no se puede aplicar al valor de tres estadios, solo para dos estados.

0

- Además, el operador lógico & & junto con || el operador no puede estar sobrecargado

2) La razón por la que el operador de bits funciona es porque opera sobre los bits individuales, que es un simple 1 ó 0. Esto es lo operadores booleanos esencialmente son, verdadero y falso, 1 y 0.

+0

??? alguna razón para un voto negativo aquí? –

3

Hay hay operadores de cortocircuito (& & ||) definidos para bool?

Sólo son la lógica AND, OR inclusivo, los operadores y se comportan como este:

x  y  x & y x | y 
true true true true 
true false false true 
true null null true 
false true false true 
false false false false 
false null false null 
null true null true 
null false false null 
null null null null 
+0

Gracias. Quizás también pueda explicar por qué se llaman cortocircuitos, estos && y || ? – badbadboy

+1

Están en "cortocircuito" porque solo evalúan varias condiciones en una declaración lógica si es necesario. Consulte http://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Operators/Logical_Operators para obtener más información. –