将值传递到异常字符串消息中

Passing a value into an Exception String Message

为什么我不能使用此代码将变量值添加到字符串中:

throw new ArgumentOutOfRangeException("Any Opening Type besides 'None', should have a minimum width value of 50. Your inputed value = {0}",value);

我得到的错误是:“CS1503:参数 2:无法从 'int' 转换为 'System.Exception?'”

但是当我使用这段代码时它工作正常:

throw new ArgumentOutOfRangeException($"Any Opening Type besides 'None', should have a minimum width value of 50. Your inputed value = {value}");

有人可以帮我理解为什么吗?据我所知,这两种方法的结果应该是一样的。我不明白为什么它会转换,如果我使用 console.WriteLine 方法,我不应该得到同样的错误吗?这有什么特别之处?

第一种语法仅适用于使用格式字符串的方法。某些方法,如 Console.WriteLine,具有 an overload,它采用格式字符串作为第一个参数,任意数量的对象作为后续参数数组,因此您可能已经习惯了它的工作方式与您使用字符串插值语法 ($"...").

大多数异常构造函数不遵循该模式,因此您必须构建自己的字符串作为消息参数传入。正如您所发现的,字符串插值语法会自动为您执行此操作。或者您可以显式调用 string.Format

throw new ArgumentOutOfRangeException(
    string.Format(
        "Any Opening Type besides 'None', should have a minimum width value of 50. Your inputed value = {0}",
        value));

您应该查看 ArgumentOutOfRangeException 的构造函数的文档。您提供的参数与任何构造函数参数类型都不匹配,因此会引发异常。

相反,您应该使用 String.Format() 格式化字符串,例如:

throw new ArgumentOutOfRangeException(String.Format("Any Opening Type besides 'None', should have a minimum width value of 50. Your inputed value = {0}",value));