Но если я спрашиваю компилятор, какой тип a
, он выводит Rextester.A
(что, я полагаю, не *)
Если под "запросом компилятора" вы имеете в видузвоните a.GetType()
, это не то, что вы делаете.Вы запрашиваете время выполнения для фактического типа объекта, на который a
ссылается.Среда выполнения правильно сообщает вам, что это Rextester.A
.
Компилятор , с другой стороны, этого не знает.Переменная объявлена как ISampleInterface
, поэтому все, что может безопасно сделать компилятор, - это привязка к методам, определенным интерфейсом.
Если вы приведете к переменной A
, то вы сможете получить доступ к ее членам:
A newA = a;
newA.myValue = 15; // perfectly valid
Обратите внимание, что фактический объектa
ссылается не изменилось (это означает, что это тот же объект - очевидно, вы изменили одно из его полей-членов).Вы по-прежнему можете ссылаться на интерфейс через a
или через класс newA
.
Если вы спросили компилятор, что это за тип a
, но с использованием метода, подобного этому:
public Type GetCompileTimeType<T>(T inputObject)
{
return typeof(T);
}
(кредит этот ответ )
и звонок
Console.WriteLine(GetCompileTimeType(a));
, вы получите Rextester.ISampleInterface