C# 为什么ushort类型的TypeConverter返回的FormatException引用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

我正在用C#和.NETCore2.0.5编写代码。当对ushort类型使用TypeConverter且转换失败时,FormatException消息引用Int16,而不是UInt16。谁能给我解释一下吗

我测试过的其他类型(decimal、double、float、int、long、short、uint、ulong)在错误消息中返回预期的typename

为了说明我的观点,这里有一个将失败的单元测试。错误消息显示“badvalue不是Int16的有效值。”

这是测试的输出:

应为:··t UInt16的有效值

实际值:··t是Int16的有效值


这是
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);