Операторы true и false — обрабатывают объекты как логическое значение.

Оператор true возвращает значение booltrue, указывая, что его операнд имеет значение true. Оператор false возвращает значение booltrue, указывая, что его операнд имеет значение false. Операторы true и false не обязательно дополняют друг друга. То есть оба оператора true и false могут вернуть значение boolfalse для одного операнда. Если тип определяет один из двух операторов, он должен также определять другой оператор.

Совет

Используйте тип bool?, если вам нужно использовать трехзначную логику (например, при работе с базами данных, которые поддерживают трехзначный логический тип). В C# предоставляются операторы & и |, которые поддерживают троичную логику с операндами bool?. См. подробнее о логических операторах, поддерживающих значение NULL в описании логических операторов.

Логические выражения

Тип с определенным оператором true может быть типом результата управляющего условного выражения в операторах if, do, while и for и условном операторе?:. Дополнительные сведения см. в описании логических выражений в спецификации языка C#.

Пользовательские условные логические операторы

Если тип с определенными операторами true и falseперегружает логические операторы OR| или AND& определенным образом, условные логические операторы OR|| или AND&& соответственно могут вычисляться для операндов этого типа. Дополнительные сведения см. в разделе Пользовательские условные логические операторы в Спецификации языка C#.

Пример

В следующем примере представлен тип, который определяет операторы true и false. Этот тип также перегружает логический оператор И & таким образом, что оператор && может быть вычислен для операндов этого типа.

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;
    }
}

Обратите внимание на поведение сокращенного вычисления оператора &&. GetFuelLaunchStatus Когда метод возвращает LaunchStatus.Redзначение , правый операнд && оператора не вычисляется. Это обусловлено тем, что LaunchStatus.Red имеет значение false. Результат логического оператора И не зависит от значения правого операнда. Выходные данные примера могут быть следующими:

Getting fuel launch status...
Wait!

См. также раздел