可访问性不一致:参数类型比方法更难访问

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】:

publicclients 的构造函数是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 设为公开的答案都是正确的。我只是在这篇文章中明确提及为什么这是一个问题

如果您的公共类构造函数的参数是 privateinternal 限定类,这意味着您将无法从外部创建该参数类的对象汇编,当不能实例化参数对象时,怎么调用这个构造函数来实例化这个类的对象呢?

【讨论】:

其他答案建议公开类型ACTInterface,而不是字段oActInterface【参考方案12】:

尝试像这样将您的构造函数设为私有:

private Foo newClass = new Foo();

【讨论】:

并非如此。这是由于嵌套保护。

以上是关于可访问性不一致:参数类型比方法更难访问的主要内容,如果未能解决你的问题,请参考以下文章

可访问性不一致:字段类型“世界”比字段“frmSplashScreen”更难访问

c#错误不一致的可访问性:参数类型'HRDMSV1.User'比方法更难访问

C#不一致的可访问性:返回类型比方法更难访问

c#访问性不一致的问题

可访问性不一致:属性类型错误

如何避免类和方法的可访问性不一致导致的编译错误?