operadores verdadeiro e falso - trate seus objetos como um valor booleano

O operador true retorna o bool valor true para indicar que seu operando é definitivamente verdadeiro, enquanto o operador false retorna o bool valor true para indicar que seu operando é definitivamente falso.
Observe que um tipo que implementa os operadores true e false deve seguir essa semântica:

  • “Esse objeto é verdadeiro?” resolve para a operadoratrue. Operador true retorna true se o objeto fortrue. A resposta é “Sim, esse objeto é verdadeiro”.
  • “Esse objeto é falso?” resolve para a operadorafalse. Operador false retorna true se o objeto for false. A resposta é "Sim, esse objeto é falso"

Não é garantido que os operadores true e false se complementem. Ou seja, ambos os operadores true e false podem retornar o valor boolfalse para o mesmo operando. Se um tipo definir um desses dois operadores, ele também deverá definir o outro operador.

Dica

Use o tipo bool? se você precisar oferecer suporte à lógica de três valores (por exemplo, ao trabalhar com bancos de dados que dão suporte a um tipo booleano de três valores). C# fornece os operadores & e | que suportam a lógica de três valores com os operandos bool?. Para obter mais informações, confira a seção Operadores lógicos booleanos anuláveis do artigo Operadores lógicos boolianos.

Expressões boolianas

Um tipo com o operador true definido pode ser o tipo de resultado de uma expressão condicional de controle nas instruções if, do, while e for e no operador condicional ?:. Para saber mais, confira a seção Expressões boolianas da Especificação da linguagem C#.

Operadores lógicos condicionais definidos pelo usuário

Se um tipo com os operadores true e false definidos sobrecarregar o operador OR lógico| ou o operador AND lógico& de uma determinada maneira, o operador OR lógico condicional|| ou operador AND lógico condicional&&, respectivamente, poderá ser avaliado para os operandos desse tipo. Para obter mais informações, veja a seção Operadores lógicos condicionais definidos pelo usuário na especificação da linguagem C#.

Exemplo

O exemplo a seguir apresenta o tipo que define os dois operadores, true e false. O tipo também sobrecarrega o operador AND lógico & de uma forma que o operador && também possa ser avaliado para os operandos desse 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;
    }
}

Observe o comportamento de curto-circuito do operador &&. Quando o método GetFuelLaunchStatus retorna LaunchStatus.Red, o operando à direita do operador && não é avaliado. Isso ocorre porque LaunchStatus.Red é, definitivamente, false. Depois, o resultado do AND lógico não depende do valor do operando à direita. A saída do exemplo é a seguinte:

Getting fuel launch status...
Wait!

Confira também