Operadores true y false: trate los objetos como un valor booleano

El operador true devuelve el valor booltrue para indicar que su operando es definitivamente true, mientras que el operador false devuelve el valor booltrue 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 operador true devuelve true si el objeto es true. La respuesta es "Sí, este objeto es true".
  • "¿Este objeto es false?" se resuelve en el operador false. El operador false devuelve true si el objeto es false. 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 boolfalse 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!

Consulte también