这段代码可以返回null吗?
(this.Result == Result.OK)
此行(或类似行)是否可以返回除 true
或 false
之外的任何内容(例如 null)?
最佳答案
(this.Result == Result.OK)
好的;让我们一 block 一 block 地看:
this.(anything)
如果 this
为 null
- 它永远不应该,那可能会失败,但是 theoretically can be if you are evil - 所以我们可能会因 NullReferenceException
而失败。
this.Result
如果这是一个属性访问器(get
),那么它可能会以任何它喜欢的方式失败——它可能会抛出异常。
Result.OK
现在;如果这是一个 enum
,它只是一个 ldc
- 但如果这个 .OK
实际上是一个静态属性访问器,它肯定会失败它喜欢的任何异常(exception)。
this.Result == Result.OK
我们需要知道 .Result
返回什么;如果我们假设它返回一个Result
(我们不知道),那么我们仍然需要知道Result
是什么:如果它是一个枚举,它将是一个直接的数字相等性检查;如果它是一个可为 null 的枚举,则适用“提升的”平等规则,但仍会干净利落地解析。如果它是重载 ==
的自定义类型,那么任何事情都可能发生并且可能导致任何异常。
但疯狂的是:==
不需要返回 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
结果。
关于c# - 它可以返回null吗? (this.Result ==Result.OK),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20285919/