可访问性不一致:参数类型比方法更难访问
Posted
技术标签:
【中文标题】可访问性不一致:参数类型比方法更难访问【英文标题】:Inconsistent Accessibility: Parameter type is less accessible than method 【发布时间】:2011-09-07 22:34:38 【问题描述】:我试图在两个表单之间传递一个对象(基本上是对当前登录用户的引用)。目前,我在登录表单中有类似的内容:
private ACTInterface oActInterface;
public void button1_Click(object sender, EventArgs e)
oActInterface = new ACTInterface(@"\\actserver\Database\Premier.pad",this.textUser.Text,this.textPass.Text);
if (oActInterface.checkLoggedIn())
//user has authed against ACT, so we can carry on
clients oClientForm = new clients(oActInterface);
this.Hide();
oClientForm.Show();
else...
在下一个表格(客户)上,我有:
public partial class clients : Form
private ACTInterface oActInt get; set;
public clients(ACTInterface _oActInt)
...这导致我得到:
Error 1 Inconsistent accessibility:
parameter type 'support.ACTInterface' is less accessible than method
'support.clients.clients(support.ACTInterface)'
c:\work\net\backup\support\support\clients.cs 20 16 support
我真的不明白问题出在哪里 - 这两个字段都是私有的,并且可以通过表单中的相关公共方法访问。谷歌搜索并没有真正的帮助,因为它只是指出一个元素是公共的,另一个是私有的,这里不是这种情况。
有人帮忙吗?
【问题讨论】:
【参考方案1】:public
类clients
的构造函数是public
,但它有一个ACTInterface
类型的参数,即private
(它嵌套在一个类中?)。你不能那样做。您需要使ACTInterface
至少与clients
一样可访问。
【讨论】:
有关更多信息,请查看有关错误CS0051的 MSDN 文章 这对我有帮助。我正在尝试执行以下操作: JsonConvert.DeserializeObject>(response.Content.ReadAsStringAsync().Result); “Name_Of_My_Model”类未设置为 Public 或 Private。结果我需要将“Name_Of_My_Model”(类)设置为公共,以便在“公共”方法中使用,该方法上面有一个 WebMethod 装饰器,用于我正在进行的 ajax 调用。 更多信息Restrictions on Using Accessibility Levels(C#) 还有@EricMilliot-Martinez,你的评论帮助了我。我还需要将 Public 添加到我的一门课程中。谢谢。【参考方案2】:公开课程。
class NewClass
等同于:
internal class NewClass
所以这个类必须是公开的
【讨论】:
谁能解释一下,好吗? 默认情况下(省略accessibility关键字)一个类是内部的,不能公开访问。最好明确声明类的可访问性以显示意图。【参考方案3】:如果听起来ACTInterface
类型不是public
,而是使用internal
(如果它是***)或private
(如果它嵌套在另一个类型中)的默认可访问性。
为类型指定 public
修饰符将修复它。
另一种方法是同时设置类型和方法internal
,如果这是您的意图。
问题不在于 字段 (oActInterface
) 的可访问性,而在于 ACTInterface
类型本身。
【讨论】:
【参考方案4】:support.ACTInterface
类型的可访问性是什么。该错误表明它不是公开的。
如果签名的某些参数类型不是公共的,则不能公开公共方法签名。由于调用者无法构造所需的参数,因此无法从外部调用该方法。
如果您将support.ACTInterface
设为公开,则会消除此错误。或者尽可能减少表单方法的可访问性。
【讨论】:
【参考方案5】:parameter type 'support.ACTInterface' is less accessible than method
'support.clients.clients(support.ACTInterface)'
错误提示“support.ACTInterface”难以访问,因为您已将接口设为私有,至少将其设为内部或公开。
【讨论】:
【参考方案6】:问题似乎不在于变量,而在于 ACTInterface 的声明。 ACTInterface 是否被声明为内部的?
【讨论】:
【参考方案7】:当我收到此错误时,我有一个“帮助”类,我没有将它声明为公共,这导致在使用“帮助”类的类内部出现此问题。公开“助手”类解决了这个错误,如下所示:
公共服务类 公共服务类(HelperClass _helper)
public class HelperClass // 注意解决了我的问题的公共 HelperClass。
这可能会帮助遇到此问题的其他人。
【讨论】:
想象一下,作为 ServiceClass 的用户,您想要构造一个对象。除非将 HelperClass 设置为 public,否则你怎么知道它是什么?这就是它背后的基本逻辑。【参考方案8】:您可以将参数(可访问性较低的类)设为object
,然后通过as
关键字将其转换为您的类。
【讨论】:
你不觉得吗?您可以将此添加为评论。【参考方案9】:如果要在新形式中使用类变量时出现此错误,则应将类定义放在
Formname.Designer.cs
而不是 Formname.cs 文件。
【讨论】:
【参考方案10】:更新我的实体框架模型后,我发现此错误感染了我的解决方案中的多个文件。我只需右键单击我的 .edmx 文件和我的 TT 文件,然后单击“运行自定义工具”,这让我在重新启动 Visual Studio 2012 后再次正确。
【讨论】:
【参考方案11】:所有将类型 ActInterface 设为公开的答案都是正确的。我只是在这篇文章中明确提及为什么这是一个问题
如果您的公共类构造函数的参数是 private 或 internal 限定类,这意味着您将无法从外部创建该参数类的对象汇编,当不能实例化参数对象时,怎么调用这个构造函数来实例化这个类的对象呢?
【讨论】:
其他答案建议公开类型ACTInterface
,而不是字段oActInterface
。【参考方案12】:
尝试像这样将您的构造函数设为私有:
private Foo newClass = new Foo();
【讨论】:
并非如此。这是由于嵌套保护。以上是关于可访问性不一致:参数类型比方法更难访问的主要内容,如果未能解决你的问题,请参考以下文章
可访问性不一致:字段类型“世界”比字段“frmSplashScreen”更难访问