我想了解空条件运算符。从书中我学到了,例如,如果我将string []数组传递给方法,我可以不使用条件作用域,而使用null条件运算符来检查传递的字符串[]数组是否为空,因为例如在方法中,我会希望使用.Length属性,如果我将null传递给它,它将导致运行时错误。空条件运算符与方法.Value可空结构
所有这一切我明白,但是当我想用泛型Nullable结构中的可为null的int和.Value属性来使用它时,它已经向我抛出了编译器错误。
我想问题会是,我不明白这是什么'?'在后缀变量之后做空。我认为它只是跳过它后面的属性或方法,但它可能会传递null并只隐藏异常。我真的不知道,所以我想问一下这个空条件运算符究竟做了些什么,为什么这个可为空的int例子会导致错误。
代码与错误:
class Program
{
static void Main(string[] args)
{
string text = null;
Console.WriteLine("Variable contains: {0}", text?.Length); //All OK
int? nullableInt = null;
Console.WriteLine("Variable contains: {0}", nullableInt?.Value); //Compiler error
Console.ReadLine();
}
}
编辑: CompilerError消息:
'INT' 不包含 '价值' 和没有扩展方法 '值' 接受第一个参数的定义可以找到'int'类型(是否缺少使用指令或程序集引用?)
编辑2: 这篇文章是重复的: null conditional operator not working with nullable types? 但是我无法从这篇文章理解的问题,但我设法得到它从感谢@adjan https://stackoverflow.com/a/44613674/7477611 张贴在那里,他解释得很好,但在我的努力procces学习它,我为稍后阅读此文的人提供了一个更好的解释,也许对于那些与我处于同一位置的人有更好的解释。如果在可空类型上使用'?'运算符,例如int?.Member(Member - 某个方法,属性...),那么如果变量为null,它将跳过成员,但是如果它具有例如5 ,那么运算符'?'返回variable.GetValueOrDefault(),它只返回int值。 (返回基本类型的Nullable),这几乎是@adjan所说的。但是,我将在这里展示的代码,对我解释了一切:
static void Main(string[] args)
{
int? number = null;
variable?.Member
// in fact operator '?' is doing folowing:
if (number.HasValue)
{
Console.WriteLine(number.GetValueOrDefault().GetType()); //System.Int32
}
else
{
Console.WriteLine(number); //null
}
}
正如你可以看到number.GetValueOrDefault()返回System.Int32数据类型,如果你想使用.Value属性它必须是空类型,并且System.Int32不是可以为空的类型,因此它没有访问.Value成员。这就是它导致错误的原因。
希望它有帮助:) 谢谢你的回答。 :)
你应该总是在你的问题中包含完整的错误信息 – UnholySheep
[null条件运算符不可用于可空类型?](https://stackoverflow.com/questions/31811392/null-conditional-operator-not-使用可空类型) – mjwills