Да, вы можете переопределить оператор 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.
}
РЕДАКТИРОВАТЬ: Как предположил Дмитрий, вероятно, стоит упомянуть, что вы также можете переопределить оператор неявного преобразования на bool
:
public static implicit operator bool(ReturnResult returnResult) =>
returnResult.IsSuccess;
Хотя true
и false
используются в булевых выражениях [^ 1], которые на момент написания этой статьи были ограничены управляющими операторами и троичным оператором ?:
, оператор неявного преобразования также будет разрешать присваивания, подобные этому:
ReturnResult rr = CallSomeFunction(a,b,c);
bool b = rr;
Вам может быть интересно, какой из них используется в операторе if
, если все три из них перегружены - ответ таков: неявное преобразование имеет приоритет согласно спецификации .
[^ 1]: А также во время оценки операторов &&
и ||
, если для типа определены пользовательские операторы &
и |
. Для получения дополнительной информации, спецификация - ваш друг .