2009-08-17 8 views
9

Je suis en train de cogner, je sais. Mais lors de l'implémentation de l'interface IConvertible sur une structure qui ne contient qu'une valeur booléenne (et n'a donc que deux états), quelle est la valeur recommandée pour retourner de IConvertible.GetTypeCode()? La structure est implicitement convertible et comparable à boolean et dans presque tous les aspects autres que la représentation de chaîne et XML, c'est effectivement un booléen.Implémentation IConvertible.GetTypeCode

Je me sens comme si je mentais à la trame si je retourne TypeCode.Boolean mais TypeCode.Object semble inutilement vague. Y a-t-il des conséquences concrètes pour la mise en œuvre de cette méthode dans vos propres structures?

IConvertible.GetTypeCode on MSDN

Répondre

3

Vous pouvez le faire - mais méfiez-vous.

De nombreuses routines utilisent directement GetTypeCode, ce qui peut avoir un impact si votre structure est passée à l'une d'elles. Si vous substituez GetTypeCode pour renvoyer TypeCode.Boolean, ces routines supposeront que votre struct est un booléen, qui peut avoir ou non des effets secondaires. En pratique, la plupart des échantillons (comme la routine IsNumeric de VB) vérifient les types numériques, donc un TypeCode booléen n'affectera probablement pas cela, mais il y a d'autres cas où cela peut avoir un effet. Certains ORM, par exemple, vérifient le code de type pour gérer l'enregistrement et le chargement d'un type. Si vous voulez que votre structure trompe le monde en pensant que c'est un bool, cela peut aider à rendre moins évident que votre type n'est pas réellement un booléen ... mais cela peut aussi causer des problèmes subtils.

+2

Merci, j'ai également depuis vérifié Reflector et trouvé quelques méthodes de bas niveau qui y accèdent telles que System.Variant.MarshalHelperConvertObjectToVariant. Je suppose que l'essentiel est qu'il y a peu ou pas de raison pour moi de l'annoncer comme un booléen, donc le meilleur plan d'action semble être de retourner simplement TypeCode.Object. – Josh

+0

C'est ce que je recommanderais, sauf si vous avez une bonne raison de ne pas le faire. Le définir sur Booléen peut avoir des conséquences inattendues. –

1

Sur la base de la description pour TypeCode.Boolean représente "Un type simple représentant des valeurs booléennes true ou false." Cela semble correspondre à la description de votre structure puisque vous avez dit qu'elle ne contient qu'une valeur booléenne et qu'elle est implicitement convertible entre elles.