Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 空条件运算符可以';不能用来做作业吗?_C#_C# 6.0 - Fatal编程技术网

C# 空条件运算符可以';不能用来做作业吗?

C# 空条件运算符可以';不能用来做作业吗?,c#,c#-6.0,C#,C# 6.0,请检查下面的代码,并帮助我可视化为什么我收到编译器错误 class Program { static void Main(string[] args) { Sample smpl = GetSampleObjectFromSomeClass(); //Compiler Error -- the left-hand side of an assignment must be a variable property or indexer

请检查下面的代码,并帮助我可视化为什么我收到编译器错误

class Program
{
    static void Main(string[] args)
    {
        Sample smpl = GetSampleObjectFromSomeClass();

        //Compiler Error -- the left-hand side of an assignment must be a variable property or indexer
        smpl?.isExtended = true; 
    }
}

public class Sample
{
    public bool isExtended { get; set; }
}
我是否应该推断空条件仅用于访问属性、变量等,而不用于赋值

注意:我已经参考了一篇类似的文章(下面的链接),但在我看来,没有进行足够的讨论

编辑: 我期待着像这样的事情

If(null!= smpl) 
{ 
smpl.isExtended = true; 
}

看来我的期望是不对的

考虑这一行代码的含义:

smpl?.isExtended = true;
var x = someObject?.someProperty;
如果
smpl
null
,您将尝试为
null
分配一个值。这没有道理

只需赋值,无需进行空检查:

smpl.isExtended = true;
基本上,空传播运算符用于读取值,而不是设置值。考虑这行代码:

smpl?.isExtended = true;
var x = someObject?.someProperty;
从概念上讲,这意味着如果存在
someObject
,则
x
将被分配
someProperty
的值。如果它不存在(为
null
),则
x
将为
null

相反,这意味着什么

someObject?.someProperty = x;
从概念上讲,这意味着如果存在
someObject
,则将
someProperty
设置为
x
。但是如果它不存在(是
null
),那么。。。将
null
设置为
x
?这没有道理:

null = x;

你的推论是正确的。空条件运算符仅适用于成员访问,不适用于分配

也就是说,我倾向于同意语言/编译器应该允许操作符用于属性赋值(而不是字段),因为属性赋值实际上是编译成方法调用的

编译后的属性分配如下所示:

smpl?.set_isExtended(true); 
这将是完全有效的代码

另一方面,很容易提出这样的论点,即它会在属性和字段使用之间引入目前不存在的语法差异,并且使代码更难推理


您还可以访问codeplex上的大部分。我粗略地扫描了一下,空条件讨论跨越了许多部分

做了编辑只是为了让我的情况更清楚@David@Vivek_Shukla:我也更新了答案。基本上,考虑在任一种情况下代码中会发生什么(是<代码> null <代码> vs.不是代码> null < /代码>。这两个案例中的一个毫无意义。因此编译器拒绝了它。这难道不是意味着:如果
someObject
存在,那么调用
someObject。set\u someProperty(x)
否则什么都不做。我的想法是一样的,@LeeGunnAs@LeeGunn暗示,在这种情况下,属性不只是一个setter方法吗?我不明白。似乎是疏忽你的推断是正确的。空条件运算符仅适用于成员访问,不适用于分配。我倾向于同意编译器应该允许它用于属性赋值(而不是字段),因为属性赋值实际上是编译成方法调用的这将是完全有效的代码。@AndrewHanlon:有趣的观察(+1),但语义和语法很难同时发挥作用。好的,给出了这些评论,我重新打开了。不确定为什么人们会问“你希望它做什么”-很明显你希望它做什么(从程序员的角度):如果不为null,则进行赋值。我猜null条件运算符在C#语言中不是有效的左值。投票@jonskeet