#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. К сожалению, я могу принять только одно. Меньшее, что я могу сделать, это поддержать всех остальных. Спасибо!