动态类型和静态类型C#
我正在用C#进行实验,并构建了以下程序(见下文) 我知道动态类型和静态类型C#,c#,inheritance,C#,Inheritance,我正在用C#进行实验,并构建了以下程序(见下文) 我知道first的动态和静态类型是C。对于second而言,动态类型也是C,但静态类型是A。现在我想知道这会在哪里派上用场 我还注意到(显然)VisualStudio不允许我调用second.CallA() 现在请注意,当我对所有三种类型的静态类型调用DoA()时,动态类型是C。既然如此,为什么this不指向该类?如果我回忆起Java中的correct(可能是错误的),那么self.methodA()将开始从调用方实例中查找inhertence树
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,如果你读了他的答案,很明显他是什么意思。这些在线解析器是可预测的。这确实是我们想要的行为。非常感谢。