2011-07-31 15 views
5

Chcę sprawdzić, czy typ obsługuje IComparable przed sortowaniem go, ale stwierdziłem, że sprawdzanie, czy typ obsługuje interfejs IComparable za pomocą "jest" nie zawsze daje mi poprawną odpowiedź. Na przykład typeof(int) is IComparable zwraca wartość false, nawet jeśli int obsługuje interfejs IComparable.Jak używać "is" do testowania, czy dany typ obsługuje IComparable?

Zauważam, że typeof(int).GetInterfaces() zawiera listę IComparable, a typeof(int).GetInterface("IComparable") zwraca typ IComparable, dlaczego więc "nie" działa tak, jak się spodziewam?

+0

Specyfikacja 'is' mówi, że zwraca wartość true, gdy konwersja nie spowoduje wyjątku. spróbuj przekonwertować 'int' na' IComparable' i sprawdź, czy nie ma problemów. – Dani

Odpowiedz

10

is prace nad instancji. Kiedy mówisz: typeof(int) is IComparable, to co naprawdę sprawdzasz, czy typ System.Type implementuje IComparable, czego nie robi. Aby korzystać is, należy użyć instancji:

bool intIsComparable = 0 is IComparable; // true 
5

int obsługuje IComparable ale typ int nie robi, to jest to, należy sprawdzić zmienną sam nie jego Type, więc:

int foo = 5; 
foo is IComparable;//the result is true, but of course it will not be true if you check typeof(foo) 
2

Operator is przewiduje wystąpienie po lewej stronie:

int i = 1; 
if (i is IComparable) ... 

kompiluje (z ostrzeżeniem o zawsze jest prawdą).

i „typeof(int) is IComparable zwraca false”

To dlatego, że jesteś pytaniem, czy (wystąpienie) klasy Type jest IComparable. Nie jest.

Powiązane problemy