C# 它能返回null吗?(this.Result==Result.OK)
这个代码能返回null吗C# 它能返回null吗?(this.Result==Result.OK),c#,null,return,C#,Null,Return,这个代码能返回null吗 (this.Result == Result.OK) 此行(或类似行)是否可以返回除true或false(例如null)之外的任何内容?运算符将始终返回true或false。这是一个布尔值 应该注意的是,问题中的“或另一个”确实可以返回非真或假的内容。除非你告诉我们你的另一个想法是我们无法回答 这个答案假设表达式确实返回了一些东西。正如Marc Gravell指出的那样,异常可能会阻止它返回(取决于您如何考虑返回)。 马克还善意地指出,==可以重载。这样做并更改返回类
(this.Result == Result.OK)
此行(或类似行)是否可以返回除
true
或false
(例如null)之外的任何内容?运算符将始终返回true或false。这是一个布尔值
应该注意的是,问题中的“或另一个”确实可以返回非真或假的内容。除非你告诉我们你的另一个想法是我们无法回答
这个答案假设表达式确实返回了一些东西。正如Marc Gravell指出的那样,异常可能会阻止它返回(取决于您如何考虑返回)。
马克还善意地指出,
==
可以重载。这样做并更改返回类型几乎肯定不是一个好主意,但理论上似乎是可能的。否,只能返回真或假,因为==
是比较运算符,此语句始终返回Bool
语句本身将返回Bool
true或false
涉及的对象:
this.Result
可能是空的,当您询问它是否可以返回null
时,这可能就是您所指的结果
执行该行并返回true
执行该行并返回false
嗯,;让我们一块一块地看一下:
this.(anything)
如果此
为空
,则可能会失败-它永远不应该是空的,但是-因此我们可能会因空引用异常
而失败
this.Result
如果这是一个属性访问器(aget
),那么它可能会以它喜欢的任何方式失败-它可能会抛出异常
Result.OK
现在;如果这是一个enum
,它只是一个ldc
——但是如果这.OK
实际上是一个静态属性访问器,它肯定会失败,并且会出现任何它喜欢的异常
this.Result == Result.OK
我们需要知道.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
}
如果结果
类型是自定义的,则(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
}
}
最后,我们需要考虑一些晦涩难懂的事情,如<代码> THEAD BABRUTTABLE < /COD>,<代码> OutOfMeMyExyExtExe> <代码>或<代码> StaskOffFurvieExp><代码>可以在任何时间<强> >
但在正常情况下:是的,它只能产生一个bool
结果。如果'this'的值为空,那么这个代码肯定会崩溃。我想它会返回boolean:)
如果可能每隔一段时间返回一次。你需要的是if(this.Result==Result.OK)返回null代码>??@xxMUROxx您对此有多确定<代码>此
为空?呵呵?你是说那个角落的案子吗?哇,忘了那个property@MarcGravell你说得对,这就是我所问的你是在谈论角落案例吗?
如果你删除第3点,我将删除我的反对票,并向上投票给你。因为这是错误的和误导的,我已经取消了我自己的答案,因为MarcGravel添加了一些东西。还是去吧right@AgnelKurian加载常量值的IL指令-例如,ldc.i4
(又名十六进制20),后跟4个字节,将常量int
加载到堆栈上(常用数字有特殊代码,或适合单个字节的数字等)。可能需要重新表述“如果您认为结果类型是自定义的”。您错过了一个案例,即它由于一段时间而从未返回(true):@mcintyre321 d'oh!我想总有另一种crazy@Chris如果我真的很邪恶,我也会超载true
。@MarcGravel:我也不会简单地在那里使用这个词。你已经证明它是不正确的,但我认为这根本不是一个简单的例子
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
}
}