我得到错误,父母'不包含' Print'的定义没有扩展方法' Print'接受第一个类型为'父母'可以找到(你错过了使用指令或程序集引用吗?)
class Program
{
public static void Main(string[] args)
{
parent p1 = new child();
p1.Print();
}
}
//Parent Class
public class parent
{
}
//Child Class
public class child : parent
{
public void Print() { }
}
答案 0 :(得分:1)
这是行动中的多态性。你声明p1
:
parent p1 = new child();
因此,您对p1
的引用是parent
的实例。该课程不包含Print()
的定义,因此错误就行:
p1.Print();
如果您将声明行更改为以下之一:
var p1 = new child();
或
child p1 = new child();
然后,当您作为p1
的实例访问child
时,错误就会消失。
或者,您可以在Print
中声明parent
并在child
中覆盖它:
public class parent
{
public virtual void Print() { // do something }
}
public class child : parent
{
public override void Print() { // do something else }
}
答案 1 :(得分:1)
编译器是正确的:parent
类没有方法Print
的定义。即使分配给p1
的对象确实有Print
,编译器也无法从p1
的声明中知道它,并且不允许使用初始化程序来计算它进行。
为了帮助编译器按照您的意愿执行操作,您需要执行以下操作之一:
parent
虚拟方法Print
提供与child
中相同的签名,并将override
添加到{{1}中的定义中1}} child
方法的接口,并使Print
实现它parent
p1
child
添加p1
的明确演员child
类型的p1
。如果采用方法1,2,3或4,C#将能够在编译时检查dynamic
对象上是否存在Print
。如果采用方法5,编译器会将检查推迟到运行时,此时CLR必须执行p1
方法的额外搜索,并调用它或抛出运行时错误。