我正在用C#和.NET Core 2.0.5编写代码。当对ushort-type使用TypeConverter且转换失败时,FormatException消息引用的是Int16,而不是UInt16。谁能向我解释一下?

我对此进行测试的其他类型(十进制, double ,浮点型,整数,长整型,短整型,uint和ulong)在错误消息中返回了预期的类型名。

为了表明我的观点,这是一个单元测试,它将失败。错误消息显示“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);
        }
    }

这是测试的输出:

最佳答案

这是UInt16Converter中的错误(您使用TypeDescriptor.GetConverter(typeof(ushort))返回的类型。具体来说,this line:

internal override Type TargetType => typeof(short);

显然应该阅读ushort而不是short。此错误是作为cleanup commit的一部分引入的,以使用表达式主体成员。

异常消息似乎是唯一受影响的东西。在转换为字符串时,它还在TypeConverter.ConvertTo中选择略有不同的代码路径,但这对UInt16值的格式没有实际影响。请注意,此类的tests并不涵盖此内容:它们仅验证ConvertFrom抛出无效值,而不验证哪种类型的异常或消息的内容。 (由于.NET异常消息已本地化,因此后者几乎可以肯定是设计使然。)

关于c# - 为什么TypeConverter为ushort-type返回的FormatException引用Int16?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49361595/

10-11 12:24