Null 条件运算符不能用于赋值?
Null Conditioning operator can't be used for assignments?
请查看以下代码并帮助我想象为什么我会收到编译器错误。
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; }
}
我是否应该推断空条件仅用于访问属性、变量等而不用于赋值?
注意:我提到了类似的 post(下面的 link),但在我看来,讨论还不够。
编辑:
我期待
If(null!= smpl)
{
smpl.isExtended = true;
}
看来我的预期不对!
考虑这行代码的含义:
smpl?.isExtended = true;
如果 smpl
是 null
,您将尝试为 null
赋值。这没有意义。
直接赋值,不需要空检查:
smpl.isExtended = true;
基本上,空传播运算符用于读取值,而不是设置它们。考虑这行代码:
var x = someObject?.someProperty;
从概念上讲,这意味着如果 someObject
存在,x
将被赋予 someProperty
的值。如果它不存在(是 null
)那么 x
将是 null
.
反过来,这意味着什么?:
someObject?.someProperty = x;
从概念上讲,这意味着如果 someObject
存在,则将 someProperty
设置为 x
。但如果它不存在(是 null
),那么...将 null
设置为 x
?这没有意义:
null = x;
你的推断是正确的。空条件运算符仅适用于成员访问,不适用于赋值。
也就是说,我倾向于同意 language/compiler 应该允许运算符用于 属性 赋值(但不是字段),因为 属性 赋值实际上是编译下来的到方法调用。
编译后的 属性 赋值看起来像:
smpl?.set_isExtended(true);
这将是完全有效的代码。
另一方面,很容易提出这样的论点,即它会在 属性 和当前不存在的字段用法之间引入语法差异,并使代码更难推理。
您还可以访问 codeplex 上的大部分 C# 6.0 design notes。我粗略地浏览了一下,null 条件的讨论跨越了很多部分。
请查看以下代码并帮助我想象为什么我会收到编译器错误。
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; }
}
我是否应该推断空条件仅用于访问属性、变量等而不用于赋值?
注意:我提到了类似的 post(下面的 link),但在我看来,讨论还不够。
编辑: 我期待
If(null!= smpl)
{
smpl.isExtended = true;
}
看来我的预期不对!
考虑这行代码的含义:
smpl?.isExtended = true;
如果 smpl
是 null
,您将尝试为 null
赋值。这没有意义。
直接赋值,不需要空检查:
smpl.isExtended = true;
基本上,空传播运算符用于读取值,而不是设置它们。考虑这行代码:
var x = someObject?.someProperty;
从概念上讲,这意味着如果 someObject
存在,x
将被赋予 someProperty
的值。如果它不存在(是 null
)那么 x
将是 null
.
反过来,这意味着什么?:
someObject?.someProperty = x;
从概念上讲,这意味着如果 someObject
存在,则将 someProperty
设置为 x
。但如果它不存在(是 null
),那么...将 null
设置为 x
?这没有意义:
null = x;
你的推断是正确的。空条件运算符仅适用于成员访问,不适用于赋值。
也就是说,我倾向于同意 language/compiler 应该允许运算符用于 属性 赋值(但不是字段),因为 属性 赋值实际上是编译下来的到方法调用。
编译后的 属性 赋值看起来像:
smpl?.set_isExtended(true);
这将是完全有效的代码。
另一方面,很容易提出这样的论点,即它会在 属性 和当前不存在的字段用法之间引入语法差异,并使代码更难推理。
您还可以访问 codeplex 上的大部分 C# 6.0 design notes。我粗略地浏览了一下,null 条件的讨论跨越了很多部分。