首页 > 解决方案 > 是否可以将对象类型转换为 bool 以返回取决于状态的内容?

问题描述

我想写一个类来包含一个bool值和一条消息。该消息用于解释为什么类包含错误值。当我使用这个类时,我想将它转换为 bool,它会返回 bool 值而不是获取属性。这可能吗 ?

public class ReturnResult
{
    public ReturnResult(bool state, string message)
    {
        IsSuccess = state;
        ErrorMessage = message;
    }

    public bool IsSuccess
    {
        get;
        private set;
    }

    public string ErrorMessage
    {
        get;
        private set;
    }
}

我想做以下

ReturnResult rr = CallSomeFunction(a,b,c);

if ((bool) rr) {
  // it is good
}
else {
  // it is bad
}

标签: c#castingbooleanoperator-overloading

解决方案


是的,您可以覆盖true运算符。

public class ReturnResult
{
    public ReturnResult(bool state, string message)
    {
        IsSuccess = state;
        ErrorMessage = message;
    }
    public bool IsSuccess
    {
        get;
        private set;
    }
    public string ErrorMessage
    {
        get;
        private set;
    }

    public static bool operator true(ReturnResult returnResult) => 
        returnResult.IsSuccess;

    public static bool operator false(ReturnResult returnResult) => 
        !returnResult.IsSuccess;    // Alternatively, implement as
                                    // returnResult ? false : true,
                                    // avoiding duplication.

}

您还必须定义匹配false运算符。现在这些行将起作用:

ReturnResult rr = CallSomeFunction(a,b,c);
if (rr) // Succeeds if the operator returns true, so if rr.IsSuccess is true.
{
    // If it's good.
}
else 
{
    // If it's bad.
}

编辑:正如 Dmitry 所建议的,可能值得一提的是,您还可以将隐式转换运算符覆盖为bool

public static implicit operator bool(ReturnResult returnResult) => 
    returnResult.IsSuccess;

虽然truefalse用于布尔表达式[^1],在撰写本文时仅限于控制语句和?:三元运算符,隐式转换运算符也允许这样的赋值:

ReturnResult rr = CallSomeFunction(a,b,c);
bool b = rr;

if如果所有三个都重载,您可能想知道在语句中使用哪一个- 答案是隐式转换优先,根据规范

[^1]:以及在&&||运算符评估期间,如果有用户定义的&|在类型上定义的运算符。有关更多信息,规范是您的朋友


推荐阅读