我在C#4中与??
运算符一起工作,发现了一个有趣的功能。
如果existingObject
已经null
而不管searchForObject()
返回值,那么这行代码始终会将空值分配给 existingObject = extstingObject ?? searchForObject();
(searchForObject返回不是null对象,实际上它是一个linq语句而不是一个函数,如果下面的语句将被简单的if if替换,那么existingObject将被赋予一个非null对象):
{{1}}
有人可以解释原因吗?
这是MSDN的a link,它说:
可空类型可以包含值,也可以是未定义的。 ?? ?? operator定义了可空类型时要返回的默认值 被指定为非可空类型。如果您尝试分配可空的 值类型为不可为空的值类型而不使用??运营商, 您将生成编译时错误。如果你使用演员,和 可空值类型目前未定义,a 将抛出InvalidOperationException异常。
关于将可空类型分配给非可空类型的部分不是我所期望的。
问题是在Visual Studio 2010的调试器中延迟初始化局部变量。
答案 0 :(得分:3)
??
是
if (somethingisnull)
somethingisnull = somethingnotnull
因此searchForObject()
必须返回null
答案 1 :(得分:2)
??如果操作数不为null,则返回左侧操作数; 否则它返回正确的操作数。
// ?? operator example.
int? x = null;
// y = x, unless x is null, in which case y = -1.
int y = x ?? -1;
答案 2 :(得分:2)
阅读:Coalescing operator - ??:Coalescing运算符是在C#2.0中添加的新运算符。合并算子也称为??。
没有?运营商
Nullable<int> a = null;
Nullable<int> b = 10;
int c = a==null ? b.Value : a;
可以替换??如下所示
Nullable<int> a = null;
Nullable<int> b = 10;
int c = a ?? b.Value;
如果第一个值为空, ??
是oeprate允许分配第二个值
existingObject = extstingObject ?? searchForObject();
所以在你的情况下,如果extstingObject
为null,则获取searchForObject()
的值并分配给object,如果你得到的是null,那么第二个函数也会返回null。
答案 3 :(得分:1)
除了我在评论中所说的内容:
您也可能没有真正查看相同的代码 你正在执行。它有时在Visual Studio中发生。重建 项目,尝试清除bin文件夹,放置一些
Debug.WriteLine
跟踪你的应用程序中真正发生的事情(而不是依靠 IDE的Watch
)等。
另一个问题浮出水面 - 作业后existingObject
是否真的为空? :)你怎么断言?
看看我的问题(以及答案):
Surprising CLR / JIT? behaviour - deferred initialization of a local variable
答案 4 :(得分:0)
原因是其他地方错了。在此行代码中,如果 existingObject 为null, searchForObject()的返回值将分配给 existingObject 。
答案 5 :(得分:0)
此处还有其他内容,searchForObject()
必须返回null
。看一下下面的例子。
object searchForObject()
{
return new object();
}
通过searchForObject()
的实施,我们可以做到这一点:
object existingObject = null;
existingObject = existingObject ?? searchForObject();
现在,如果我们像这样测试一下:
Console.Write("existingObject is ");
if (existingObject == null) Console.WriteLine("null");
else Console.WriteLine("not null");
它会告诉我们existingObject is not null
。但是,如果我们更改searchForObject()
返回的内容:
object searchForObject()
{
return null;
}
它会告诉我们existingObject is null
。现在,最后一个测试是在我们进行第一次检查之前更改existingObject
的值:
object existingObject = new object();
existingObject = existingObject ?? searchForObject();
这会告诉我们existingObject is not null
。
如果existingObject
为null,则表示??
之后的任何内容都返回null。