【发布时间】:2014-07-01 08:04:53
【问题描述】:
我不知道为什么下面的程序编译时没有警告,但是在异常块中条件运算符给出了 NullReferenceException。
using System;
namespace Playground
{
class Program
{
static void Main(string[] args)
{
string message1 = "First message.";
string message2 = null;
// This works without a problem
Console.WriteLine(message1 + message2 == null ? "" : Environment.NewLine + message2);
Console.ReadKey();
try
{
throw new Exception("Now with an exception.");
}
catch (Exception ex)
{
// This will give a NullReferenceException:
Console.WriteLine(ex.Message + ex.InnerException == null ? "" : Environment.NewLine + ex.InnerException.Message);
// ..But this will work:
Console.WriteLine(ex.Message + (ex.InnerException == null ? "" : Environment.NewLine + ex.InnerException.Message));
}
}
}
}
我知道?? 运算符,我的问题是为什么异常处理程序中的第一行会给出 NullReferenceException。
【问题讨论】:
-
@Atomosk (Environment.NewLine + ex.InnerException.Message) 应该可以解决问题 如果
ex.InnerException为空,那么仍然会抛出异常 -
“但这会起作用:”这一行与另一行大不相同,我希望你能意识到这一点。除了
ex.Message + ex.InnerException == null,因为你的情况真的没有任何意义。这里当 innerException 为 null 时为假,因为 "foo" + null = "foo" -
不带括号相当于'将 ex.Message 与 ex.InnerException.ToString() 连接,然后将结果与 null 进行比较'。
-
那么为什么
Console.WriteLine(message1 + message2 == null ? "" : Environment.NewLine + message2);有效? -
@Meine 与 null 连接是可以的,调用 null 的
Message是异常。把Environment.NewLine + message2改成Environment.NewLine + message2.ToString()会抛出异常。
标签: c# conditional-expressions