在下面的代码中,为什么两个string.Format调用的行为方式不同?在第一种情况下,不会抛出异常,但在第二种情况下会抛出ArgumentNullException.

static void Main(string[] args)
{
    Exception e = null;
    string msgOne = string.Format("An exception occurred: {0}", e);
    string msgTwo = string.Format("Another exception occurred: {0}", null);
}

有人能帮我理解一下这两者的区别吗?

推荐答案

我在这里猜想,但这看起来是你要拨打的重载呼叫的不同之处;String.Format有多个.

在第一个例子中,你达到String.Format(string,object)是有道理的.

在第二个示例中,通过提供null,您最有可能达到String.Format(string,params object[]),根据文档,在以下情况下会产生ArgumentNullException:

格式或参数为空.

如果你在 run .NET4,try 使用命名参数:

String.Format("Another exception occured: {0}", arg0: null);

为什么它会超负荷运行?可能是因为null不是一个对象,params的工作方式是,您可以在调用or中将either个值作为一个新对象传递给它,并向其传递一个值array.也就是说,以下是one in the same:

String.Format("Hello, {0}! Today is {1}.", "World", "Sunny");
String.Format("Hello, {0}! Today is {1}.", new Object[]{ "World", "Sunny" })

因此,它将您的语句调用转换为类似的内容:

String format = "Another exception occured: {0}";
Object[] args = null;
String.Format(format, args); // throw new ArgumentNullException();

.net相关问答推荐

从Couchbase删除_txn文档的推荐方法?""

ASP.NET核心最小API必须以正斜杠开头吗?

从窗体中移除另一个控件中引用的控件时获取设计时通知

EFCore.DbSet.Update 方法添加新行而不是更新它

保存时不保留 XML 格式

关于在 .NET 中干净地终止线程的问题

lock() 是否保证按请求的顺序获得?

C# 的部分类是糟糕的设计吗?

当程序员说针对接口而不是对象的代码时,他们是什么意思?

.NET 事件 - 什么是对象发送者和 EventArgs e?

在 .NET 中填充整数列表

获取 .NET 程序集的 AssemblyInformationalVersion 值?

ASP.NET Core (.NET Core) 和 ASP.NET Core (.NET Framework) 的区别

从流中获取 TextReader?

功能说明

如何隐藏 WPF ListView 的标题?

ConfigurationManager.AppSettings - 如何修改和保存?

C# ListView 列宽自动

您可以将 Microsoft Entity Framework 与 Oracle 一起使用吗?

多行 C# 插值字符串文字