19

私はC#でtrueとfalseをオーバーロードすることについて読んでいますが、これとbool演算子の定義の基本的な違いを理解していると思います。私が見ている例は次のようなものです。

public static bool operator true(Foo foo) {
  return (foo.PropA > 0);
}
public static bool operator false(Foo foo) {
  return (foo.PropA <= 0);
}

私にとって、これは次のように言うのと同じです。

public static implicit operator bool(Foo foo) {
  return (foo.PropA > 0);
}

私が知る限り、違いは、trueとfalseを別々に定義することにより、trueとfalseの両方、またはtrueとfalseのどちらでもないオブジェクトを持つことができるということです。

public static bool operator true(Foo foo) { return true; }
public static bool operator false(Foo foo) { return true; }
//or
public static bool operator true(Foo foo) { return false; }
public static bool operator false(Foo foo) { return false; }

これが許可される理由は確かにありますが、私はそれが何であるかを考えることができません。私にとって、オブジェクトをtrueまたはfalseに変換できるようにする場合は、単一のブール演算子が最も理にかなっています。

誰かが私にそれを他の方法で行うことが理にかなっているシナリオを与えることができますか?

ありがとう

4

4 に答える 4

12

ドキュメントにあるように、オーバーロードは(null許容)データベースタイプ(Yes / No、Y / N、0/1など)をサポートすることを目的としていますtruefalse

そしてもちろん、他の演算子と同様に、一貫性のない定義をすることができます。賢明なものを返すのはあなたの責任です。コンパイラーは、どちらかまたは両方を必要とするだけです。

于 2010-04-19T21:42:23.953 に答える
8

これらの演算子が存在することを私は知りませんでした。つまり、自己否定のパラドックスを実装できます。

public class ThisClassIsFalse
{
    public static bool operator true(ThisClassIsFalse statement)
    {
        return statement ? false : true;
    }

    public static bool operator false(ThisClassIsFalse statement)
    {
        return statement ? true : false;
    }
}

これで、この古典的なパラドックスの真の解決策がわかりました...StackOverflowException。

于 2010-04-20T01:53:33.883 に答える
2

Linqが存在する前は、.NET 2.0で式を作成するなどの巧妙なことを行うために、人々がオーバーロードしtrueたりオーバーロードしたりするのを見てきました。false

Ayendeは、彼のNHQGプロジェクトを使用して、NHibernate基準クエリを構築するために次のような構文を作成しました。

return Repository.FindAll(
    (Where.Publisher.Name == name) &&
    (Where.Publisher.City == city));
于 2010-04-19T21:58:56.473 に答える
1

システムによっては、trueはゼロ以外の値にすることができます。その他の場合は、任意の正の値にすることができます。

他のシステムは真のブール値ではなく、ブール値に対して3番目の状態nullまたはnillを許可します。そのため、単一のbool演算子をオーバーロードするのではなく、trueとfalseをオーバーロードする場合があります。

于 2010-04-19T21:29:11.623 に答える