true および false 演算子 - オブジェクトをブール値として扱います

true 演算子は、オペランドが確実に true であることを示すためにブール値の true を返します。一方、false 演算子は、オペランドが確実に false であることを示す bool 値の true を返します。
truefalse 演算子の両方を実装する型は、次のセマンティクスに従う必要があることに注意してください。

  • "このオブジェクトは true ですか?" は演算子 true に解決されます。 演算子 true は、オブジェクトが true の場合に true を返します。 答えは "はい、このオブジェクトは true です" です。
  • "このオブジェクトは false ですか?" は演算子 false に解決されます。 演算子 false は、オブジェクトが false の場合に true を返します。 答えは "はい、このオブジェクトは false です" です

true および false 演算子が互いに補完することは保証されていません。 つまり、truefalse 演算子の両方が同じオペランドに対して boolfalse を返す場合があります。 ある型でこの 2 つの演算子の 1 つを定義する場合は、もう 1 つの演算子も定義する必要があります。

ヒント

3 値ロジックをサポートする必要がある場合は、bool? 型を使用します。たとえば、3 値ブール型をサポートするデータベースを操作する場合などです。 C# には、bool? オペランドを使用して 3 値ロジックをサポートする & および | 演算子があります。 詳細については、「Boolean logical operators (ブール論理演算子)」記事の「Nullable Boolean logical operators (null 許容論理演算子)」セクションを参照してください。

ブール式

true 演算子が定義された型は、ifdowhile、および for ステートメントと、条件演算子 ?: の制御条件式の結果の型にすることができます。 詳細については、「C# 言語仕様」のブール型の式に関するセクションを参照してください。

ユーザー定義の条件付き論理演算子

truefalse 演算子が定義された型によって、論理 OR 演算子| または論理 AND 演算子& が特定の方法でオーバーロードされる場合、条件付き論理 OR 演算子|| または 条件付き論理 AND 演算子&& を、それぞれ、その型のオペランドに対して評価することができます。 詳細については、「C# 言語仕様」のユーザー定義型条件論理演算子に関するセクションを参照してください。

次の例では、truefalse 演算子の両方を定義する型を示します。 この型により、論理 AND 演算子 & もオーバーロードされ、演算子 && もその型のオペランドで評価できるようになります。

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 であるためです。 したがって、論理 AND の結果は右側のオペランドの値に依存しません。 この例の出力は次のとおりです。

Getting fuel launch status...
Wait!

関連項目