はじめに?
タイトル落ちです。
偶然タイトルを思いついてしまったので、勢いで記事にしてしまいました。
bool?
型の論理演算ってどうなるの?
C#でbool?
型への論理演算はどうなるのかを試してみましょう。
-
!A
(NOT) -
A&B
(AND) -
A|B
(OR) -
A^B
(XOR)
試す論理演算は上記の通りです。
言語仕様に含意が無いのが残念(わがまま)
コード?
ネタ記事ですが、コードくらいは載せましょう……
試したコード
class SanValueBoolean {
public void Do() {
var bools = new bool?[] { true, false, null };
foreach (var b in bools) {
LogicalNot(b);
}
var pairs = from b1 in bools from b2 in bools select (b1, b2);
foreach (var (b1, b2) in pairs) {
LogicalOperation(b1, b2);
}
}
/// <summary>AND,OR,XOR</summary>
void LogicalOperation(bool? left, bool? right) {
Console.WriteLine($"{left.ToDisp()}\t& {right.ToDisp()}\t= {(left & right).ToDisp()}");
Console.WriteLine($"{left.ToDisp()}\t| {right.ToDisp()}\t= {(left | right).ToDisp()}");
Console.WriteLine($"{left.ToDisp()}\t^ {right.ToDisp()}\t= {(left ^ right).ToDisp()}");
}
/// <summary>NOT</summary>
void LogicalNot(bool? value) {
Console.WriteLine($"!{(value).ToDisp()}\t= {(!value).ToDisp()}");
}
}
/// <summary>表示の補助</summary>
static class NullableExt {
public static string ToDisp(this bool? b) => b?.ToString() ?? "NULL";
}
結果?
結果は以下のとおり。
!True = False
!False = True
!NULL = NULL
True & True = True
True | True = True
True ^ True = False
True & False = False
True | False = True
True ^ False = True
True & NULL = NULL
True | NULL = True
True ^ NULL = NULL
False & True = False
False | True = True
False ^ True = True
False & False = False
False | False = False
False ^ False = False
False & NULL = False
False | NULL = NULL
False ^ NULL = NULL
NULL & True = NULL
NULL | True = True
NULL ^ True = NULL
NULL & False = False
NULL | False = NULL
NULL ^ False = NULL
NULL & NULL = NULL
NULL | NULL = NULL
NULL ^ NULL = NULL
まとめ?
以下の定義を与えるとクリーネの3値論理になります。
SQLの論理型と同じような感じですね。
含意(A⇒B)
bool? IMP(bool? left, bool? right) => !left | right;
この記事を読んで何か得るものがあるとすれば、以下の事実でしょう。__null
が絡むすべての演算がの結果null
になるわけではない__ということです。
False & NULL = False
True | NULL = True
以上、出オチ記事を最後まで読んでいただきありがとうございました。