В чем разница между typeof и ключевым словом is?

#c# #generics #types

#c# #обобщения #типы

Вопрос:

В чем точная разница между ними?

 // When calling this method with GetByType<MyClass>()

public bool GetByType<T>() {
    // this returns true:
    return typeof(T).Equals(typeof(MyClass));

    // this returns false:
    return typeof(T) is MyClass;
}
  

Комментарии:

1. Предупреждение — Это не сработает, если вам нужно использовать наследование. Использование typeof(AClass).IsAssignableFrom(typeof(T)) решит эту проблему. Смотрите msdn.microsoft.com/en-us/library /… .

2. @Will спасибо за информацию. В моем конкретном случае это не имеет значения, но полезно знать!

Ответ №1:

Вы должны использовать is AClass в экземплярах, а не для сравнения типов:

 var myInstance = new AClass();
var isit = myInstance is AClass; //true
  

is работает также с базовыми классами и интерфейсами:

 MemoryStream stream = new MemoryStream();

bool isStream = stream is Stream; //true
bool isIDispo = stream is IDisposable; //true
  

Комментарии:

1. Спасибо. Хорошее, краткое и исчерпывающее объяснение.

Ответ №2:

is Ключевое слово проверяет, относится ли объект к определенному типу. typeof(T) имеет тип Type , а не тип AClass .

Проверьте MSDN на наличие ключевого слова is и ключевого слова typeof

Комментарии:

1. К сожалению, я могу принять только одно. Меньшее, что я могу сделать, это поддержать всех остальных. Спасибо!

Ответ №3:

typeof(T) возвращает Type экземпляр. и Type никогда не равно AClass

 var t1 = typeof(AClass)); // t1 is a "Type" object

var t2 = new AClass(); // t2 is a "AClass" object

t2 is AClass; // true
t1 is AClass; // false, because of t1 is a "Type" instance, not a "AClass" instance
  

Комментарии:

1. К сожалению, я могу принять только одно. Меньшее, что я могу сделать, это поддержать всех остальных. Спасибо!

Ответ №4:

  • typeof(T) возвращает объект типа
  • Тип не является AClass и никогда не может быть, поскольку Type не является производным от AClass

ваше первое утверждение верно

Комментарии:

1. К сожалению, я могу принять только одно. Меньшее, что я могу сделать, это поддержать всех остальных. Спасибо!

Ответ №5:

typeof возвращает Type объект, описывающий T , который не имеет типа, AClass следовательно is , возвращает false.

Комментарии:

1. К сожалению, я могу принять только одно. Меньшее, что я могу сделать, это поддержать всех остальных. Спасибо!

Ответ №6:

  • сначала сравнивает два объекта типа (типы сами являются объектами в .net)
  • во-вторых, если написано хорошо (myObj — это класс), проверьте совместимость между двумя типами. если myObj является экземпляром класса, наследуемого от AClass , он вернет true .

typeof(T) — это AClass возвращает false, потому что typeof(T) — это Type, а AClass не наследует от Type

Комментарии:

1. К сожалению, я могу принять только одно. Меньшее, что я могу сделать, это поддержать всех остальных. Спасибо!