动态类型和静态类型C#

动态类型和静态类型C#,c#,inheritance,C#,Inheritance,我正在用C#进行实验,并构建了以下程序(见下文) 我知道first的动态和静态类型是C。对于second而言,动态类型也是C,但静态类型是A。现在我想知道这会在哪里派上用场 我还注意到(显然)VisualStudio不允许我调用second.CallA() 现在请注意,当我对所有三种类型的静态类型调用DoA()时,动态类型是C。既然如此,为什么this不指向该类?如果我回忆起Java中的correct(可能是错误的),那么self.methodA()将开始从调用方实例中查找inhertence树

我正在用C#进行实验,并构建了以下程序(见下文)

我知道
first
的动态和静态类型是
C
。对于
second
而言,动态类型也是
C
,但静态类型是
A
。现在我想知道这会在哪里派上用场

我还注意到(显然)VisualStudio不允许我调用
second.CallA()

现在请注意,当我对所有三种类型的静态类型调用DoA()时,动态类型是
C
。既然如此,为什么
this
不指向该类?如果我回忆起Java中的correct(可能是错误的),那么
self.methodA()
将开始从调用方实例中查找inhertence树。因为这里看起来不是这样的。我可以创造这样的行为吗?或者这是语言的限制吗

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!
我可以创造这样的行为吗?或者这是语言的限制吗

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();
    }
您可以创建这样的行为。为了做到这一点,您需要使您的方法虚拟化。这将为您提供该行为,而根本不使用动态

public class A
{
    public virtual void methodA()
    {
        Console.WriteLine("I am class A!");
    }
然后,稍后:

public class B : A
{
    public override void methodA()
    {
        Console.WriteLine("I am class B!");
    }
}

在C#中,必须显式地使方法虚拟化。在Java中,默认情况下方法是有效的虚拟方法。这不是语言的局限性,只是两种语言之间的差异。

当您指的是“运行时类型”时,您似乎使用了“动态类型”一词。这会使阅读问题变得混乱,尤其是当你的程序确实使用(某些)动态键入时。动态,在C#中,通常用于完全不同的目的。你真的不需要
dynamic
来完成你想要完成的事情。@ReedCopsey这只是为了测试目的,看看我会得到什么结果。@Servy,如果你读了他的答案,很明显他是什么意思。这些在线解析器是可预测的。这确实是我们想要的行为。非常感谢。