2009-08-17 15 views
9

Estoy picando, lo sé. Pero cuando se implementa la interfaz IConvertible en una estructura que contiene solo un valor booleano (y, por lo tanto, tiene solo dos estados), ¿cuál es el valor recomendado para devolver desde IConvertible.GetTypeCode()? La estructura es implícitamente convertible y comparable a boolean y en casi todos los aspectos que no sean cadenas y representaciones XML, es efectivamente un booleano.Implementando IConvertible.GetTypeCode

Siento que estoy mintiendo al marco si devuelvo TypeCode.Boolean pero TypeCode.Object parece innecesariamente vago. ¿Existen consecuencias en el mundo real para implementar este método en sus propias estructuras?

IConvertible.GetTypeCode on MSDN

Respuesta

3

Puede hacer esto, pero tenga cuidado.

Muchas rutinas usan GetTypeCode directamente, y esto puede tener un impacto si su estructura se pasa a una de ellas. Si reemplaza GetTypeCode para devolver TypeCode.Boolean, estas rutinas supondrán que su estructura es un bool, que puede tener o no efectos secundarios impares.

En la práctica, la mayoría de las muestras (como la rutina IsNumeric de VB) comprueban los tipos numéricos, por lo que un tipo de código bool probablemente no afecte esto, pero hay otros casos en los que puede tener un efecto. Algunos ORM, por ejemplo, verifican el código de tipo para gestionar el guardado y la carga de un tipo. Si quieres que tu estructura engañe al mundo para que piense que es un bool, eso puede ayudar a que sea menos obvio que tu tipo no es realmente booleano ... pero también puede causar problemas sutiles.

+2

Gracias, he comprobado desde Reflector también y he encontrado un par de métodos de bajo nivel que acceden a él, como System.Variant.MarshalHelperConvertObjectToVariant. Supongo que la conclusión es que no tengo ninguna razón para anunciarlo como booleano, por lo que lo mejor sería simplemente devolver TypeCode.Object. – Josh

+0

Eso es lo que recomendaría, a menos que tengas una buena razón para no hacerlo. Establecerlo en Boolean puede tener consecuencias no deseadas. –

1

Basándose en la descripción para TypeCode.Boolean que representa "Un tipo simple que representa valores booleanos de verdadero o falso." Parece que encaja con la descripción de su estructura, ya que dijo que solo contiene un valor booleano y es implícitamente convertible entre ellos.