C#操作符是如何工作的?

C#操作符是如何工作的?,c#,operators,C#,Operators,我在使用C#4中的?操作符时发现了一个有趣的特性 这行代码始终为现有对象分配null,如果它已经是null,则不考虑searchForObject()返回值(searchForObject返回一个NOTNULL对象,事实上它是一个linq语句而不是一个函数,如果以下语句将替换为简单的if构造,则现有对象将被分配一个NOTNULL对象): 有人能解释一下原因吗 这是给MSDN的,上面写着: 可为空的类型可以包含值,也可以是未定义的?? 运算符定义当类型为可空时要返回的默认值 已分配给不可为空的类型

我在使用C#4中的
操作符时发现了一个有趣的特性

这行代码始终
现有对象
分配null,如果它已经是
null
,则不考虑
searchForObject()
返回值(searchForObject返回一个NOTNULL对象,事实上它是一个linq语句而不是一个函数,如果以下语句将替换为简单的if构造,则现有对象将被分配一个NOTNULL对象):

有人能解释一下原因吗

这是给MSDN的,上面写着:

可为空的类型可以包含值,也可以是未定义的?? 运算符定义当类型为可空时要返回的默认值 已分配给不可为空的类型。如果尝试分配可为空的 值类型转换为不可为null的值类型,而不使用??运算符, 您将生成编译时错误 可为null的值类型当前未定义,为 将引发InvalidOperationException异常

关于将可空类型分配给不可空类型的部分不是我所期望的


该问题是Visual Studio 2010调试器中局部变量的延迟初始化。

if (somethingisnull)
  somethingisnull = somethingnotnull

因此,
searchForObject()
也必须返回null

原因是其他地方出错。在这行代码中,如果existingObject为null,则searchForObject()的返回值将分配给existingObject

?如果操作数不为空,则返回左侧操作数; 否则返回正确的操作数

合并运算符是C#2.0中添加的新运算符。合并运算符也称为

无??运算符


因此,在您的情况下,如果
extstingObject
为null,则获取
searchForObject()
的值并分配给object,如果获取null,则第二个函数也会返回null。

除了我在这篇评论中所说的以外:


还有一种可能是,您实际上没有看到相同的代码 您正在执行的。有时会在Visual Studio中发生。重建 在项目中,尝试清除bin文件夹,放置一些
Debug.WriteLine
s 以跟踪应用程序中的真实情况(而不是依赖 IDE的
监视
)等

另一个问题浮现在脑海中-赋值后,
existingObject
真的为空吗?:)你是如何断言的

看看我的问题(和答案):


这里还有其他问题,
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");
它将告诉我们,
现有对象不为null
。但是,如果我们更改
searchForObject()
返回的内容:

object searchForObject()
{
    return null;
}
它将告诉我们,
existingObject为null
。现在,最后一个测试是在进行第一次检查之前更改
existingObject
的值:

object existingObject = new object();
existingObject = existingObject ?? searchForObject();
这将告诉我们,
现有对象不为null


如果
existingObject
为null,这意味着
之后的任何内容都返回null。

显然
searchForObject
方法返回null。可能是因为
searchForObject()
始终返回null/您在调试器中已经过它了吗?您是否有searchForObject()的代码?很抱歉,不够清楚,没有searchForObject不返回Null也有可能您实际查看的代码与正在执行的代码不同。它有时发生在VisualStudio中。重建项目,尝试清除bin文件夹,放入一些
Debug.WriteLine
s以跟踪应用程序中的实际情况(而不是依赖IDE的
Watch
),等等。事实上,如果使用此结构,我会得到一个值。existingObject是什么类型,searchForObject返回什么类型?searchForObject代码无关紧要,它可以是任何东西,你自己试试看,我认为捕获是将对象分配给它自己。是的,这是msdn的一个例子,它也说??用于将可为null的类型分配给不可为null的类型不能将null分配给不可为null的类型
object searchForObject()
{
    return new object();
}
object existingObject = null;
existingObject = existingObject ?? searchForObject();
Console.Write("existingObject is ");
if (existingObject == null) Console.WriteLine("null");
else Console.WriteLine("not null");
object searchForObject()
{
    return null;
}
object existingObject = new object();
existingObject = existingObject ?? searchForObject();