c# - 是否可以将对象类型转换为 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
}
解决方案
是的,您可以覆盖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;
虽然true
和false
用于布尔表达式[^1],在撰写本文时仅限于控制语句和?:
三元运算符,隐式转换运算符也允许这样的赋值:
ReturnResult rr = CallSomeFunction(a,b,c);
bool b = rr;
if
如果所有三个都重载,您可能想知道在语句中使用哪一个- 答案是隐式转换优先,根据规范。
[^1]:以及在&&
和||
运算符评估期间,如果有用户定义的&
和|
在类型上定义的运算符。有关更多信息,规范是您的朋友。
推荐阅读
- jenkins - 获取其他工作的构建 git commit
- javascript - 当浏览器空闲且页面中有动态 iframe 时,JavaScript 检测浏览器不活动期
- objective-c - NSTextField 的 -allowsExpansionToolTips 在以编程方式更改约束后不起作用
- shell - 以交互方式从 JAVA 运行 Spark-Shell
- javascript - 使用 withLatestFrom 的效果甚至没有触发 ofType(action)
- ios - 如何在 React 应用程序中使用 Swift 视图控制器?
- php - 如何在弹出期间从href链接获取id
- json - Kotlin - 如何在杰克逊 Json 反序列化期间防止 null 进入 Map 对象?
- python - 如何使用 node.js 和 Dialogflow
- signals - QTableView 没有行区的信号