C# 使用Null传播运算符和Null合并运算符引发Null异常
我正在尝试获取链接变量中的空值 我已经创建了三个脚本。一级,二级,三级。级别1的公共变量为级别2,级别2的公共变量为级别3,并在级别3中设置对象变量 使用Null传播操作符,我将它们链接在一起,并尝试在level3中输出对象的名称 我故意从level1init函数中注释掉level2的设置,以导致错误 这就像预期的那样。然后,我添加了一个null合并操作符,试图确定链式检查中的哪个值为null。这就是我陷入困境的地方C# 使用Null传播运算符和Null合并运算符引发Null异常,c#,null-coalescing-operator,argumentnullexception,null-propagation-operator,C#,Null Coalescing Operator,Argumentnullexception,Null Propagation Operator,我正在尝试获取链接变量中的空值 我已经创建了三个脚本。一级,二级,三级。级别1的公共变量为级别2,级别2的公共变量为级别3,并在级别3中设置对象变量 使用Null传播操作符,我将它们链接在一起,并尝试在level3中输出对象的名称 我故意从level1init函数中注释掉level2的设置,以导致错误 这就像预期的那样。然后,我添加了一个null合并操作符,试图确定链式检查中的哪个值为null。这就是我陷入困境的地方 公共类级别1 { 公共级别2 m_级别2; //在第一帧更新之前调用Start
公共类级别1
{
公共级别2 m_级别2;
//在第一帧更新之前调用Start
void Init()
{
//m_level2=新的level2();
字符串sName=m_level2?.m_level3?.m_obj3?.name??抛出新的ArgumentNullException(nameof(m_level2),“变量不能为null”);
Console.WriteLine(“名称:+sName”);
}
}
在我的控制台中,我得到了错误
ArgumentNullException:变量不能为null
参数名称:m_level2“
这是有道理的,但这只是因为我在nameof()检查中加入了'm_level2',我需要知道在那里放什么,这样它就可以知道链中哪个变量是空的。你不能。即使
name
为空,也会返回null。您需要编写一个if()的链。您必须单独检查每个属性(即m_level2、m_level_3、m_obj3、name)。顺便说一下,我觉得ArgumentNullException
在这里并不正确:您没有传递给此方法的参数。自定义异常可能更好。您正在直接引用未实例化的属性。此时甚至没有到达null传播运算符。