2009-08-17 31 views
9

Jestem dziurkowana, wiem. Ale kiedy implementujesz interfejs IConvertible na strukturze, która zawiera tylko wartość boolowską (a zatem ma tylko dwa stany), jaka jest zalecana wartość, aby powrócić z IConvertible.GetTypeCode()? Struktura jest niejawnie wymienialna i porównywalna z boolowską iw prawie każdym aspekcie innym niż ciąg znaków i reprezentacja XML, to faktycznie jest boolowska.Implementacja IConvertible.GetTypeCode

Czuję się jakbym leżał na ramie, jeśli wrócę TypeCode.Boolean, ale TypeCode.Object wydaje się niepotrzebnie niejasna. Czy istnieją jakieś rzeczywiste konsekwencje we wdrażaniu tej metody we własnych strukturach?

IConvertible.GetTypeCode on MSDN

Odpowiedz

3

Możesz to zrobić - ale bądź ostrożny.

Wiele procedur używa bezpośrednio kodu GetTypeCode, co może mieć wpływ, jeśli struktura zostanie przekazana do jednego z nich. Jeśli nadpiszesz GetTypeCode, aby zwrócić TypeCode.Boolean, te procedury przyjmą, że twój struct jest boolem, co może, ale nie musi mieć dziwnych efektów ubocznych.

W praktyce większość próbek (takich jak procedura IsNumeric VB) sprawdza typy liczbowe, więc kod typu bool prawdopodobnie nie wpłynie na to, ale istnieją inne przypadki, w których może to mieć wpływ. Niektóre ORM, na przykład, sprawdzają kod typu, aby obsłużyć zapisywanie i ładowanie typu. Jeśli chcesz, aby Twoja struktura zmyliła świat, myśląc, że jest to bool, może to sprawić, że stanie się mniej oczywistym, że twój typ nie jest w rzeczywistości boolowskim ... ale może również powodować subtelne problemy.

+2

Dzięki, od czasu do czasu sprawdziłem Reflector i znalazłem kilka metod niskiego poziomu, które mają do niego dostęp, takie jak System.Variant.MarshalHelperConvertObjectToVariant. Domyślam się, że nie ma żadnego powodu, dla któregobym mógł go reklamować jako boolean, więc najlepszym sposobem działania jest po prostu zwrócenie TypeCode.Object. – Josh

+0

To jest to, co polecam, chyba że masz silny powód, aby tego nie robić. Ustawienie go na Boolean może mieć niezamierzone konsekwencje. –

1

Na podstawie opisu dla TypeCode.Boolean reprezentuje „typu prostego reprezentującą Boolean wartości prawda lub fałsz”. Brzmi to tak, jakby pasowało do opisu twojej struktury, ponieważ powiedziałeś, że zawiera ona tylko wartość typu Boolean i jest niejawnie wymienialna między nimi.