次の方法で共有


True 演算子と false 演算子

true 演算子は、オペランドが確実に true であることを示すためにブール値の true を返します。一方、false 演算子は、オペランドが確実に false であることを示す bool 値の true を返します。

C# 言語リファレンスには、C# 言語の最新リリース バージョンが記載されています。 また、今後の言語リリースのパブリック プレビューの機能に関する初期ドキュメントも含まれています。

このドキュメントでは、言語の最後の 3 つのバージョンまたは現在のパブリック プレビューで最初に導入された機能を特定します。

ヒント

C# で機能が初めて導入された時期を確認するには、 C# 言語バージョン履歴に関する記事を参照してください。

true演算子とfalse演算子の両方を実装する型は、次のセマンティクスに従う必要があります。

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

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

ヒント

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

ブール式

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

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

truefalse 演算子が定義された型によって、論理 OR 演算子 または| が特定の方法で&される場合、条件付き論理 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 が返されると、&& 演算子の右側のオペランドは評価されません。 この条件は間違いなく false です。 論理 AND の結果は、右側のオペランドの値に依存しません。 この例の出力は次のとおりです。

Getting fuel launch status...
Wait!

関連項目