Как я могу использовать «is», чтобы проверить, поддерживает ли тип IComparable? - PullRequest
5 голосов
/ 31 июля 2011

Я хочу проверить, поддерживает ли тип IComparable, перед его сортировкой, но я обнаружил, что проверка, поддерживает ли тип интерфейс IComparable с использованием «is», не всегда дает мне правильный ответ. Например, typeof(int) is IComparable возвращает значение false, хотя int поддерживает интерфейс IComparable.

Я отмечаю, что typeof(int).GetInterfaces() перечисляет IComparable, а typeof(int).GetInterface("IComparable") возвращает тип IComparable, так почему же "is" не работает, как я ожидаю?

Ответы [ 3 ]

10 голосов
/ 31 июля 2011

is работает на экземпляре.Когда вы говорите typeof(int) is IComparable, тогда вы действительно проверяете, реализует ли тип System.Type IComparable, чего нет.Чтобы использовать is, вы должны использовать экземпляр:

bool intIsComparable = 0 is IComparable; // true
5 голосов
/ 31 июля 2011

int поддерживает IComparable, но тип int не поддерживает, то есть вы должны проверить саму переменную, а не ее Тип , поэтому:

int foo = 5;
foo is IComparable;//the result is true, but of course it will not be true if you check typeof(foo)
2 голосов
/ 31 июля 2011

Оператор is ожидает экземпляр слева:

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

Компилирует (с предупреждением о том, что всегда верно).

И «typeof(int) is IComparable возвращает ложь»

Это потому, что вы спрашиваете, является ли (экземпляр) класса Type класс IComparable. Это не.

...