Operadores true y false: trate los objetos como un valor booleano
El operador true
devuelve el valor bool true
para indicar que su operando es definitivamente true, mientras que el operador false
devuelve el valor bool
true
para indicar que su operando es definitivamente false.
Observe que un tipo que implementa los operadores true
y false
debe seguir esta semántica:
- "¿Este objeto es true?" se resuelve en el operador
true
. El operadortrue
devuelvetrue
si el objeto estrue
. La respuesta es "Sí, este objeto es true". - "¿Este objeto es false?" se resuelve en el operador
false
. El operadorfalse
devuelvetrue
si el objeto esfalse
. La respuesta es "Sí, este objeto es false".
Los operadores true
y false
no garantizan que se complementen entre sí. Es decir, tanto el operador true
como false
podrían devolver el valor bool
false
del mismo operando. Si un tipo define uno de estos dos operadores, también debe definir el otro operador.
Sugerencia
Use el tipo bool?
, si tiene que admitir la lógica de tres valores (por ejemplo, cuando trabaja con bases de datos que admiten un tipo booleano de tres valores). C# proporciona los operadores &
y |
que admiten la lógica de tres valores con los operandos bool?
. Para más información, consulte la sección Operadores lógicos booleanos que aceptan valores NULL del artículo Operadores lógicos booleanos.
Expresiones booleanas
Un tipo con el operador true
definido puede ser el tipo de un resultado de una expresión condicional de control en las instruciones if, do, while y for y en el operador condicional ?:
. Para más información, vea la sección Expresiones booleanas de la Especificación del lenguaje C#.
Operadores lógicos condicionales definidos por el usuario
Si un tipo con los operadores true
y false
definidos sobrecarga el operador lógico OR |
o el operador lógico AND &
de una manera determinada, el operador lógico condicional OR ||
o el operador lógico condicional AND &&
, respectivamente, se puede evaluar para los operandos de ese tipo. Para obtener más información, vea la sección Operadores lógicos condicionales definidos por el usuario de la Especificación del lenguaje C#.
Ejemplo
El ejemplo siguiente muestra el tipo que define los operadores true
y false
. Además, el tipo sobrecarga el operador lógico AND &
de manera que el operador &&
también se puede evaluar para los operandos de ese tipo.
public struct LaunchStatus
{
public static readonly LaunchStatus Green = new LaunchStatus(0);
public static readonly LaunchStatus Yellow = new LaunchStatus(1);
public static readonly LaunchStatus Red = new LaunchStatus(2);
private int status;
private LaunchStatus(int status)
{
this.status = status;
}
public static bool operator true(LaunchStatus x) => x == Green || x == Yellow;
public static bool operator false(LaunchStatus x) => x == Red;
public static LaunchStatus operator &(LaunchStatus x, LaunchStatus y)
{
if (x == Red || y == Red || (x == Yellow && y == Yellow))
{
return Red;
}
if (x == Yellow || y == Yellow)
{
return Yellow;
}
return Green;
}
public static bool operator ==(LaunchStatus x, LaunchStatus y) => x.status == y.status;
public static bool operator !=(LaunchStatus x, LaunchStatus y) => !(x == y);
public override bool Equals(object obj) => obj is LaunchStatus other && this == other;
public override int GetHashCode() => status;
}
public class LaunchStatusTest
{
public static void Main()
{
LaunchStatus okToLaunch = GetFuelLaunchStatus() && GetNavigationLaunchStatus();
Console.WriteLine(okToLaunch ? "Ready to go!" : "Wait!");
}
static LaunchStatus GetFuelLaunchStatus()
{
Console.WriteLine("Getting fuel launch status...");
return LaunchStatus.Red;
}
static LaunchStatus GetNavigationLaunchStatus()
{
Console.WriteLine("Getting navigation launch status...");
return LaunchStatus.Yellow;
}
}
Tenga en cuenta el comportamiento de cortocircuito del operador &&
. Cuando el método GetFuelLaunchStatus
devuelve LaunchStatus.Red
, el operando derecho del operador &&
no se evalúa. Eso es porque LaunchStatus.Red
es definitivamente false. A continuación, el resultado de AND lógico no depende del valor del operando derecho. El resultado del ejemplo es el siguiente:
Getting fuel launch status...
Wait!