Причина в том, что вы объявили переменную mess
типа BaseMessage
.Поэтому, когда вы запрашиваете тип, он возвращает BaseMessage
.
Это разница между тем, как GetType
и typeof
ведут себя.GetType
возвращает тип объекта фактический во время выполнения, который может отличаться от типа переменной, которая ссылается на объект, если задействовано наследование (как это имеет место в вашем примере).В отличие от GetType
, typeof
разрешается в время компиляции в литерал типа точного указанного типа.
public class BaseMessage { }
public class OtherMessage : BaseMessage { }
private BaseMessage getMessage()
{
return new OtherMessage();
}
private void CheckType<T>(T type)
{
Console.WriteLine(type.GetType().ToString()); // prints OtherMessage
Console.WriteLine(typeof(T).ToString()); // prints BaseMessage
}
private void DoChecks()
{
BaseMessage mess = getMessage();
CheckType(mess);
}
Вы должны выбрать правильный инструмент для задания.Используйте typeof
, если вы хотите получить тип во время компиляции.Используйте GetType
, если вы хотите получить тип объекта во время выполнения.