Может ли этот код вернуть 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
Есть два возможных результата.