对于原始类型,TypeConverters是否已被破坏?

ros*_*dia 8 .net c# typeconverter

我遇到了一个与DecimalConverterInt32Converter类有关的问题,它们似乎返回了不一致的结果,如下面的简单控制台程序所示:

using System;
using System.ComponentModel;

class App
{
    static void Main()
    {
        var decConverter = TypeDescriptor.GetConverter(typeof(decimal));
        Console.WriteLine("Converter: {0}", decConverter.GetType().FullName);
        Console.WriteLine("CanConvert from int to decimal: {0}", decConverter.CanConvertFrom(typeof(int)));
        Console.WriteLine("CanConvert to int from decimal: {0}", decConverter.CanConvertTo(typeof(int)));

        Console.WriteLine();

        var intConverter =  TypeDescriptor.GetConverter(typeof(int));
        Console.WriteLine("Converter: {0}", intConverter.GetType().FullName);
        Console.WriteLine("CanConvert from int to decimal: {0}", intConverter.CanConvertTo(typeof(decimal)));
        Console.WriteLine("CanConvert to int from decimal: {0}", intConverter.CanConvertFrom(typeof(decimal)));
    }
}
Run Code Online (Sandbox Code Playgroud)

这个输出如下:

Converter: System.ComponentModel.DecimalConverter
CanConvert from int to decimal: False
CanConvert to int from decimal: True

Converter: System.ComponentModel.Int32Converter
CanConvert from int to decimal: False
CanConvert to int from decimal: False
Run Code Online (Sandbox Code Playgroud)

除非我不正确地理解TypeConverters,否则以下内容应该成立:

TypeDescriptor.GetConverter(typeof(TypeA)).CanConvertFrom(typeof(TypeB))
Run Code Online (Sandbox Code Playgroud)

应该给出相同的结果

TypeDescriptor.GetConverter(typeof(TypeB)).CanConvertTo(typeof(TypeA))
Run Code Online (Sandbox Code Playgroud)

至少在的情况下,System.Int32System.Decimal,他们不这样做.

我的问题是:有人知道这是否符合设计要求?或者C#中的本机类型的TypeConverters是否真的坏了?

Chr*_*non 2

根据Int32Converter 的MSDN 文档...

此转换器只能在 32 位有符号整数对象与字符串之间进行转换。

我同意评论中的@svick,不过,我不明白为什么您需要首先通过 Int32 将 JSON 字符串反序列化为 Decimal。

  • @BryanRoss你见过[这个StackOverflow问题吗?](http://stackoverflow.com/questions/8964646/javascriptserializer-and-asp-net-mvc-model-binding-yield- Different-results)我怀疑它非常相似解决您的问题,因为您需要将小数作为带引号的字符串传递。JavaScriptSerializer 会错误地猜测类型,并最终根据其错误的猜测尝试不适当的转换,但显式引用这些值将尝试字符串到类型的转换,这应该是一个更可行的解决方案。 (2认同)