Может ли этот код вернуть null?
(this.Result == Result.OK)
Может ли эта строка (или аналогичная) возвращать что-либо, кроме true или false (например, null)?
Может ли этот код вернуть null?
(this.Result == Result.OK)
Может ли эта строка (или аналогичная) возвращать что-либо, кроме true или false (например, null)?
(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.
Оператор == всегда возвращает true или false. Это boolean.
Следует отметить, что "или другое" в вашем вопросе действительно может вернуть что-то иное, кроме истинного или ложного. Если вы не скажете нам, что другой вы имеете в виду, мы не можем ответить на это.
Этот ответ предполагает, что выражение действительно возвращает что-то. Как отмечает Марк Гравелл, исключения могут остановить его вообще (в зависимости от того, как вы считаете возвращение).
Также Марк любезно отметил, что == может быть перегружен. Это почти наверняка плохая идея сделать это и изменить тип возврата, но, похоже, это теоретически возможно.
Поскольку == - оператор сравнения, этот оператор всегда возвращает a Bool
Нет, == может возвращать только true или false.
Само утверждение вернет значение bool true или false.
Объект:
this.Result
Может быть, он имеет значение null, возможно, это то, о чем вы говорите, когда спрашиваете, может ли он вернуться null
Есть два возможных результата.