В чем разница между typeof и ключевым словом?
Какая точная разница между ними?
// 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
Вы должны использовать 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
Ответ 2
Ключевое слово is
проверяет, имеет ли объект определенный тип. typeof(T)
имеет тип Type
, а не тип AClass
.
Проверьте MSDN для ключевое слово и ключевое слово typeof
Ответ 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
Ответ 4
- typeof (T) возвращает объект Type
- Тип не является классом и никогда не может быть, поскольку тип не получается из класса AClass
ваше первое утверждение правильно
Ответ 5
typeof
возвращает объект Type
, описывающий T
, который не имеет тип AClass
, поэтому is
возвращает false.
Ответ 6
- сначала сравнивает два объекта Type (типы сами являются объектами в .net)
- второй, если хорошо написано (myObj - AClass), проверьте совместимость между двумя типами. если myObj является экземпляром класса, наследующего от AClass, он вернет true.
typeof (T) - AClass возвращает false, потому что typeof (T) - Type и AClass не наследуется от Type