C# 为什么ushort类型的TypeConverter返回的FormatException引用Int16?
我正在用C#和.NETCore2.0.5编写代码。当对ushort类型使用TypeConverter且转换失败时,FormatException消息引用Int16,而不是UInt16。谁能给我解释一下吗 我测试过的其他类型(decimal、double、float、int、long、short、uint、ulong)在错误消息中返回预期的typename 为了说明我的观点,这里有一个将失败的单元测试。错误消息显示“badvalue不是Int16的有效值。” 这是测试的输出: 应为:··t UInt16的有效值 实际值:··t是Int16的有效值C# 为什么ushort类型的TypeConverter返回的FormatException引用Int16?,c#,.net-core,typeconverter,C#,.net Core,Typeconverter,我正在用C#和.NETCore2.0.5编写代码。当对ushort类型使用TypeConverter且转换失败时,FormatException消息引用Int16,而不是UInt16。谁能给我解释一下吗 我测试过的其他类型(decimal、double、float、int、long、short、uint、ulong)在错误消息中返回预期的typename 为了说明我的观点,这里有一个将失败的单元测试。错误消息显示“badvalue不是Int16的有效值。” 这是测试的输出: 应为:··t UIn
这是
UInt16Converter
(使用TypeDescriptor.GetConverter(typeof(ushort))返回的类型)中的一个错误。
显然应该阅读ushort
而不是short
。此错误是作为使用表达式体成员的一部分引入的
异常消息似乎是唯一受影响的内容。当转换为字符串时,它还会在
TypeConverter.ConvertTo
中选择稍有不同的代码路径,但这对UInt16
值的格式没有实际影响。请注意,此类的不包括这一点:它们只验证ConvertFrom
抛出一个无效值,但不是抛出什么类型的异常或消息的内容。(后者几乎可以肯定是设计的,因为.NET异常消息是本地化的。)首先捕获(异常ex)不仅在转换器错误时停止。它还会停止OutOfMemory、InvalidOperation、DeviceByzero和任何您无法想象的其他内容。Put catch(FormatException)如果您希望获得FormatException只是为了确认:您在生产代码中并不是真的依赖于此,对吗?这只是演示问题的一种简单方法?一般来说,您应该永远不要依赖任何异常的文本内容。(即使如此,该消息在.NET Framework上具有预期的内容,因此这可能只是核心中的一个bug。)从这个问题上看,代码示例是否足够用于演示应该是:Debug.WriteLine(typeof(ushort).Name);感谢上帝的开源。错误是:第18行读取内部重写类型TargetType=>typeof(short);
,而不是内部重写类型TargetType=>typeof(ushort)
。可能是一些糟糕的复制粘贴。为了更好地衡量,最初是正确的(在.NET Framework上仍然是正确的)。
[Fact]
public void FailingToConvertUShort_GivesFormatExceptionMessage_WithCorrectType()
{
// Arrange
var badvalue = "badvalue";
var typeConverter = TypeDescriptor.GetConverter(typeof(ushort));
try
{
// Act
var result = typeConverter.ConvertFrom(context: null, culture: new CultureInfo("en-GB"), value: badvalue);
}
catch (Exception ex)
{
// Assert
Assert.Equal($"badvalue is not a valid value for {typeof(ushort).Name}.", ex.Message);
}
}
internal override Type TargetType => typeof(short);