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 演算子が互いに補完することは保証されていません。 つまり、true と false 演算子の両方が同じオペランドに対して bool 値 false を返す場合があります。 ある型でこの 2 つの演算子の 1 つを定義する場合は、もう 1 つの演算子も定義する必要があります。
ヒント
3 つの値を持つロジックをサポートする必要がある場合 (たとえば、3 値のブール型をサポートするデータベースを使用する場合) には、 bool? 型を使用します。 C# には、bool? オペランドを使用して 3 つの値を持つロジックをサポートする&演算子と|演算子が用意されています。 詳細については、「Boolean logical operators (ブール論理演算子)」記事の「Nullable Boolean logical operators (null 許容論理演算子)」セクションを参照してください。
ブール式
true 演算子が定義された型は、if、do、while、および for ステートメントと、条件演算子 ?: の制御条件式の結果の型にすることができます。 詳細については、「C# 言語仕様」のブール型の式に関するセクションを参照してください。
ユーザー定義の条件付き論理演算子
true と false 演算子が定義された型によって、論理 OR 演算子 または| が特定の方法で&される場合、条件付き論理 OR 演算子|| または 条件付き論理 AND 演算子&& を、それぞれ、その型のオペランドに対して評価することができます。 詳細については、「C# 言語仕様」のユーザー定義型条件論理演算子に関するセクションを参照してください。
例
次の例では、true と false 演算子の両方を定義する型を示します。 また、この型は、&&演算子がその型のオペランドに対して評価できるように、論理 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!
関連項目
.NET