我正在用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/