estoy corriendo en un problema con los DecimalConverter
y Int32Converter
clases, que parecen estar volviendo resultados inconsistentes, como lo demuestra el siguiente programa de consola sencilla:TypeConverters roto para tipos primitivos?
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)));
}
}
El resultado de esto es la siguiente:
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
A menos que yo estoy entendiendo TypeConverters incorrectamente, el siguiente debe ser cierto:
TypeDescriptor.GetConverter(typeof(TypeA)).CanConvertFrom(typeof(TypeB))
debe dar el mismo resultado que
TypeDescriptor.GetConverter(typeof(TypeB)).CanConvertTo(typeof(TypeA))
Al menos en el caso de System.Int32
y System.Decimal
, no lo hacen.
Mi pregunta es esta: ¿Alguien sabe si esto es por diseño? ¿O están realmente rotos los TypeConverters para los tipos nativos en C#?
No entiendo por qué necesita convertir 'int' a' decimal' al deserializar JSON, ya que JSON contiene cadenas, no 'int's. – svick
He ampliado mi pregunta para aclarar. Me di cuenta de que probablemente podría manejar esto asegurándome de serializar todo como una cadena en su camino hacia el navegador, pero esa no es realmente la pregunta, más un preludio. – rossipedia