Я хочу проверить, является ли общий тип T классом Student или чем-то еще.
в заявлении If я делаю это:
if (T is Student)
{
// Do sth.
}
и он не компилируется и говорит:
T - это тип, который недействителен в данном контексте
Я знаю, что код ниже будет работать вместо этого:
if (typeof(T) == typeof(Student))
{
// Do sth.
}
Но мне просто понравилось использовать ключевое слово is, потому что оно делает мой код более читабельным.
В чем причина этой ошибки и есть ли способ использовать это или нет?
Помимо синтаксической проблемы у вас также есть семантическая проблема: дженерики, как следует из названия, должны работать для всех типов. Выполнение любых проверок типов для параметра типа в значительной степени противоречит их идее.





В чем причина этой ошибки?
Причина в том, что вы спрашиваете, является ли определенный Type (или может быть) чем-то другим, кроме типа Type. и ответ однозначно НЕТ.
и есть ли способ использовать это или нет?
Да, но для этого вам понадобится экземпляр объекта, например T myObject, тогда вы можете спросить
if (myObject is Student)
{
// Do sth.
}
Представьте себе реальный сценарий, в котором у вас есть человек по имени Питер. Петр является примером типа человека. В вашем примере вы пытаетесь спросить: "если человек студент...". что довольно сложно понять или на языке компилятора:
недействителен в данном контексте
тогда как вопрос «если Питер студент..» звучит гораздо более понятно, даже для компилятора С#;)
Спасибо за исчерпывающий ответ, кстати, "если студент - человек" будет иметь смысл... Но я понял, спасибо.
но
isработает только для примера ... вы не можете сделатьType1 is Type2вы можете только сделатьinstance is Type