C#-Can';不能从不同的类访问公共函数

C#-Can';不能从不同的类访问公共函数,c#,C#,我从C#开始,我遇到了一个问题 我创建了一个“Windows窗体应用程序”项目 我有一个名为form1的表单类,并添加了一个名为usercontrol1的UserControl类。在usercontrol1中,我有一个名为test的公共函数,它返回123 出于某种原因,我不能这样做: private void Form1_Load(object sender, EventArgs e) { UserControl usercontroltest = new usercontrol1(); u

我从C#开始,我遇到了一个问题

我创建了一个“Windows窗体应用程序”项目

我有一个名为form1的表单类,并添加了一个名为usercontrol1的UserControl类。在usercontrol1中,我有一个名为test的公共函数,它返回123

出于某种原因,我不能这样做:

private void Form1_Load(object sender, EventArgs e)
{
 UserControl usercontroltest = new usercontrol1();
 usercontroltest.test();
} 

我得到的错误是“用户控件不包含”

的定义这是因为您已将变量声明为
UserControl
类型。这意味着编译器只允许您使用
UserControl
中声明的成员及其继承的类。在执行时,实际对象的类型仍然是
usercontrol1
,但编译器只关心您试图用来调用该方法的变量的编译时类型

您需要更改声明以使用特定类:

usercontrol1 usercontroltest = new usercontrol1();
或者可以使用隐式类型的局部变量,其效果完全相同:

var usercontroltest = new usercontrol1();
这将解决眼前的问题,但:

  • 是否确实要在此处创建新实例,而不是使用表单上已有的实例
  • 你应该尽快养成这样的习惯

这是因为您已声明变量的类型为
UserControl
。这意味着编译器只允许您使用
UserControl
中声明的成员及其继承的类。在执行时,实际对象的类型仍然是
usercontrol1
,但编译器只关心您试图用来调用该方法的变量的编译时类型

您需要更改声明以使用特定类:

usercontrol1 usercontroltest = new usercontrol1();
或者可以使用隐式类型的局部变量,其效果完全相同:

var usercontroltest = new usercontrol1();
这将解决眼前的问题,但:

  • 是否确实要在此处创建新实例,而不是使用表单上已有的实例
  • 你应该尽快养成这样的习惯
当它分配一个新的
usercontrol1
时,它将它分配给它的基类
UserControl
UserControl
没有
test()
方法

您可能想要:

usercontrol1 usercontroltest = new usercontrol1();
相反

当它分配一个新的
usercontrol1
时,它将它分配给它的基类
UserControl
UserControl
没有
test()
方法

您可能想要:

usercontrol1 usercontroltest = new usercontrol1();


相反。

您可以显示UserControl类的代码吗?发布UserControl代码。是否标记为静态?它是否位于未生成的其他程序集中?更改
UserControl usercontroltest=new usercontrol1()
to
var usercontroltest=new usercontrol1()@evelikov92:不正确。
var
关键字将从表达式本身推断类型,表达式本身的类型为
usercontrol1
。这个建议确实解决了问题。(至少,它将解决编译器错误并成功执行。尽管如此,这里仍然可能存在潜在的设计问题……)当从右侧可以明显看出结果类型时,我总是使用
var
。我很懒,喜欢少打字。另外@David是正确的。你能显示UserControl类的代码吗?发布UserControl代码。是否标记为静态?它是否位于未生成的其他程序集中?更改
UserControl usercontroltest=new usercontrol1()
to
var usercontroltest=new usercontrol1()@evelikov92:不正确。
var
关键字将从表达式本身推断类型,表达式本身的类型为
usercontrol1
。这个建议确实解决了问题。(至少,它将解决编译器错误并成功执行。尽管如此,这里仍然可能存在潜在的设计问题……)当从右侧可以明显看出结果类型时,我总是使用
var
。我很懒,喜欢少打字。还有@David是对的。该死,现在一切都有意义了!谢谢我没有得到第一个问题?谢谢你的链接;)@Th3lmuu90:通常情况下,您使用表单上已经存在的控件。在窗体设计器中创建。很可能您已经得到了正确类型的字段。我们真的不知道你想用这个控件做什么,但是创建一个新实例(并将结果引用分配给一个局部变量而不是一个字段)可能是一个错误。@jonsket为什么不page?@NullException:当然,这稍微好一点-更新了链接。我刚刚使用了搜索“.net命名约定”时出现的链接:“@NullException,该链接帮助更多,谢谢。JonSkeet,我是个新手,想弄清楚事情是怎么回事。我有一个控件(代码)和它的设计,我是不是做错了,但在主窗体类中创建了它的实例?该死,现在一切都有意义了!谢谢我没有得到第一个问题?谢谢你的链接;)@Th3lmuu90:通常情况下,您使用表单上已经存在的控件。在窗体设计器中创建。很可能您已经得到了正确类型的字段。我们真的不知道你想用这个控件做什么,但是创建一个新实例(并将结果引用分配给一个局部变量而不是一个字段)可能是一个错误。@jonsket为什么不page?@NullException:当然,这稍微好一点-更新了链接。我刚刚使用了搜索“.net命名约定”时出现的链接:“@NullException,该链接帮助更多,谢谢。JonSkeet,我是个新手,想弄清楚事情是怎么回事。我有一个控件(代码)和它的设计,我是否做得不对,但在主窗体类中创建了它的实例?