【发布时间】:2023-03-30 11:11:02
【问题描述】:
我有一个自定义类,它同时实现了 == 和 implicit 用于布尔运算符。
这是处理所有可能的正确方法吗,如果 ==/!= 语句并获得预期结果? 像这样:
public class Foo
{
public bool Result { get; set; }
public static bool operator ==(bool @bool, Foo foo)
{
return Equals(foo, @bool);
}
public static bool operator !=(bool @bool, Foo foo)
{
return NotEquals(foo, @bool);
}
public static bool operator ==(Foo foo, bool @bool)
{
return Equals(foo, @bool);
}
public static bool operator !=(Foo foo, bool @bool)
{
return NotEquals(foo, @bool);
}
public static bool operator ==(Foo foo, Foo fooB)
{
return Equals(foo, fooB);
}
public static bool operator !=(Foo foo, Foo fooB)
{
return NotEquals(foo, fooB);
}
public static implicit operator bool(Foo foo)
{
try { return foo.Result; }
catch { return false; }
}
private static bool Equals(Foo foo, Foo fooB)
{
if (object.Equals(foo, null))
{
if (object.Equals(fooB, null))
return true;
return false;
}
if (object.Equals(fooB, null))
return false;
return foo.Result == fooB.Result;
}
private static bool NotEquals(Foo foo, Foo fooB)
{
if (object.Equals(foo, null))
{
if (object.Equals(fooB, null))
return false;
return true;
}
if (object.Equals(fooB, null))
return true;
return fooB.Result != foo.Result;
}
private static bool Equals(Foo foo, bool @bool)
{
if (object.Equals(foo, null))
return true;
return @bool == foo.Result;
}
private static bool NotEquals(Foo foo, bool @bool)
{
if (object.Equals(foo, null))
return false;
return @bool != foo.Result;
}
}
我特别想知道你似乎真的需要为任何一个实现重载
if (new Foo() != true)
和
if (true != new Foo())
【问题讨论】:
-
你为什么要这样做而不是有一个方法
bool PossibleResult()? -
@Jon 我正在开发一个 EntityFramework 应用程序,以 Firebird 作为我的数据库,遗憾的是,当前版本的 Firebird 不支持布尔值,所以我想创建一个自定义类,将其分配给我的 EDMX 文件中的字段。通过隐式转换为 bool 和覆盖相等运算符,我可以使用 DataBinding,就好像它是一个布尔值一样,不需要为每个 bool 属性编写包装器。
-
我不确定我是否了解全部情况,但听起来构建时代码生成可以帮助您。 Google T4 模板,它们内置于 VS 中,完全符合要求。
-
不清楚你在问什么——或者这在 CodeReview 上是否真的会更好。我真的不喜欢您隐式转换为 bool 实现...捕获 all 异常并吞下它们,而不是仅检查 null?伊克。
-
@Dan 我想不出一个好名字,所以我把它命名为 bool,你必须应用 @,因为 bool 是 C# 中的保留关键字。
标签: c# operators overriding implicit