Можно ли напечатать приведение объекта к типу bool для возврата чего-либо, зависит от состояния? - PullRequest
4 голосов
/ 08 октября 2019

Я хочу написать класс, содержащий значение 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
}

Ответы [ 2 ]

4 голосов
/ 08 октября 2019

Да, вы можете переопределить оператор 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]: А также во время оценки операторов && и ||, если для типа определены пользовательские операторы & и |. Для получения дополнительной информации, спецификация - ваш друг .

0 голосов
/ 08 октября 2019

это должно работать, если вы напишите это так (я бы не стал):

ReturnResult rr = CallSomeFunction(a,b,c);
if (rr.IsSuccesss) {
  // it is good
}
else {
  // it is bad
}
...