Может ли он вернуть значение null? (this.Result == Result.OK)

Может ли этот код вернуть null?

(this.Result == Result.OK)

Может ли эта строка (или аналогичная) возвращать что-либо, кроме true или false (например, null)?

Ответ 1

(this.Result == Result.OK)

OK; пусть возьмите это по частям:

this.(anything)

Это может быть неудачно, если this - null - это никогда не должно быть, но теоретически может быть, если вы злы - так что мы можем потерпеть неудачу с помощью NullReferenceException.

this.Result

если это свойство accessor (a get), то он может потерпеть неудачу любым способом, который ему нравится - он может генерировать исключение.

Result.OK

в настоящее время; если это enum, это всего лишь ldc, но если этот .OK фактически является аксессуаром для статического свойства, он, безусловно, может потерпеть неудачу с любым исключением, которое ему нравится.

this.Result == Result.OK

Нам нужно знать, что возвращает .Result; если мы предположим, что он возвращает a Result (мы этого не знаем), нам все равно нужно знать, что такое Result: если это перечисление, это будет прямая проверка числового равенства; если это нулевое перечисление, применяются правила "поднятого" равенства, но все же решаются чисто. Если это настраиваемый тип, который перегружает ==, тогда все может произойти, и любое исключение может возникнуть.

Но вот сумасшедший: == не нужно возвращать bool:

public static int operator ==(int x, Foo foo)
{
    return 0; // DO NOT EVER DO THIS
}
public static int operator !=(int x, Foo foo)
{
    return 0; // DO NOT EVER DO THIS
}

Если тип Result является настраиваемым, то (this.Result == Result.OK) может вернуть все, что угодно:

using System;
class P
{
    static void Main()
    {
        new P().Test();
    }
    public Result Result { get; set; }
    public void Test()
    {
        var x = (this.Result == Result.OK);
        Console.WriteLine(x.GetType().Name); // Int32
    }
}
public class Result
{
    public static Result OK { get { return null; } }
    public static int operator ==(Result x, Result y)
    {
        return 42; // DO NOT EVER DO THIS
    }
    public static int operator !=(Result x, Result y)
    {
        return 0; // DO NOT EVER DO THIS
    }
}

Наконец, нам нужно подумать, что что-то неясное, как ThreadAbortException, OutOfMemoryException или StackOverflowException может произойти в любое время.

Но в нормальных условиях: да, это может привести только к результату bool.

Ответ 2

Оператор == всегда возвращает true или false. Это boolean.

Следует отметить, что "или другое" в вашем вопросе действительно может вернуть что-то иное, кроме истинного или ложного. Если вы не скажете нам, что другой вы имеете в виду, мы не можем ответить на это.

Этот ответ предполагает, что выражение действительно возвращает что-то. Как отмечает Марк Гравелл, исключения могут остановить его вообще (в зависимости от того, как вы считаете возвращение).

Также Марк любезно отметил, что == может быть перегружен. Это почти наверняка плохая идея сделать это и изменить тип возврата, но, похоже, это теоретически возможно.

Ответ 3

Поскольку == - оператор сравнения, этот оператор всегда возвращает a Bool

Ответ 4

Нет, == может возвращать только true или false.

Ответ 5

Само утверждение вернет значение bool true или false.

Объект:

this.Result

Может быть, он имеет значение null, возможно, это то, о чем вы говорите, когда спрашиваете, может ли он вернуться null

Ответ 6

Есть два возможных результата.

  • Строка выполняется и возвращает true
  • выполняется строка, и она возвращает false