Ответ 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
.