Я экспериментирую с C#, и я построил следующую программу (см. Ниже).Динамический тип и статический тип C#
Я понимаю, что динамический и статический тип first
- C
. Для second
динамический тип также C
, но статический тип A
. Теперь я задаюсь вопросом, где это может пригодиться?
Я заметил также (очевидно), что визуальная студия не позволяет мне звонить second.CallA()
.
Теперь обратите внимание, что при вызове DoA() для всех трех типов статического типа динамический тип - C
. Как это имеет место, почему this
не указывает на этот класс? Если я назову правильный (я мог бы ошибаться) в Java, то self.methodA()
начнет искать дерево наследования из экземпляра вызывающего. Как кажется, это не так. Могу ли я создать такое поведение или это ограничение языка?
public class A
{
public void methodA()
{
Console.WriteLine("I am class A!");
}
public void DoA()
{
Console.Write("The type of this: " + this.GetType() + " - ");
this.methodA();
}
}
public class B : A
{
public void methodA()
{
Console.WriteLine("I am class B!");
}
}
public class C : B
{
public void methodA()
{
Console.WriteLine("I am class C!");
}
}
class Program
{
static void Main(string[] args)
{
C first = new C();
A second = new C();
dynamic third = new C();
//Show the types of both
Console.WriteLine(first.GetType() + "\n" + second.GetType() + "\n" + third.GetType());
first.methodA();
second.methodA();
third.methodA();
first.DoA();
second.DoA();
third.DoA();
Console.ReadLine();
}
Выход:
C
C
C
I am class C!
I am class A!
I am class C!
The type of this: C - I am class A!
The type of this: C - I am class A!
The type of this: C - I am class A!
Вы, кажется, используете слово «динамический тип», когда имеете в виду «тип времени выполнения». Это затрудняет чтение вашего вопроса, особенно когда ваша программа действительно использует (некоторую) динамическую типизацию. – Servy
Динамический, в C#, обычно используется для совершенно иной цели, чем это. Вам действительно не нужна «динамическая», чтобы делать то, что вы пытаетесь выполнить. –
@ReedCopsey Это было просто для тестирования, чтобы посмотреть, какой результат я получу. –