为什么TypeHverter为ushort类型返回的FormatException引用Int16?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么TypeHverter为ushort类型返回的FormatException引用Int16?相关的知识,希望对你有一定的参考价值。

我在C#和.NET Core 2.0.5中编写代码。对于ushort类型使用TypeConverter并且转换失败时,FormatException-message引用Int16而不是UInt16。任何人都可以向我解释这个吗?

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

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

    [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);
        }
    }

这是测试的输出:

预期:···是UInt16的有效值。

实际:···Int16的有效值。

答案

这是UInt16Converter中的一个错误(你用TypeDescriptor.GetConverter(typeof(ushort))回来的类型。具体来说,this line

internal override Type TargetType => typeof(short);

显然应该阅读ushort而不是short。这个bug是作为cleanup commit的一部分引入的,用于表达身体的成员。

异常的消息似乎是唯一受到影响的事情。当转换为字符串时,它还会在TypeConverter.ConvertTo中选择稍微不同的代码路径,但这对UInt16值的格式没有实际影响。请注意,此类的tests不包含此内容:它们仅验证ConvertFrom是否抛出了无效值,而不是该类型的异常或消息内容。 (后者几乎可以肯定是设计,因为.NET异常消息是本地化的。)

以上是关于为什么TypeHverter为ushort类型返回的FormatException引用Int16?的主要内容,如果未能解决你的问题,请参考以下文章

linux下 DWORD,USHORT等数据类型声明包含在那个头文件中

VB.NET的整型数据类型

C# 是不是有办法将具有 int 字段(字节、ushort、ulong 等)的对象编写为字节数组?

C#如何把INT类型转换为方法参数对应的枚举类型?怎么强制转换?

c#中的数据类型

为啥我们不能有“char”枚举类型