C#运算符`??`是如何工作的?

时间:2012-03-26 09:20:51

标签: c# operators

我在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的调试器中延迟初始化局部变量。

6 个答案:

答案 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。