【问题标题】:Inconsistent accessibility error declaring public class method with internal type (C#)?使用内部类型(C#)声明公共类方法时出现不一致的可访问性错误?
【发布时间】:2013-04-23 04:04:38
【问题描述】:

我有一个 JSON 类对象,它是一个内部类。我想保持这种方式以防止其他代码尝试创建该类型的对象,因为我只希望 JSON 反序列化代码执行此操作。我可以将类类型用作变量,但如果我尝试返回该类型的对象,我会收到 inconsistent accessibiliy 编译器错误,因为方法是 public 和类是内部

解决这种情况的最佳方法是什么?我想我可以为内部类创建一个接口并传递它,但这意味着我必须为我正在使用的每个 JSON 类创建额外的包袱,而且我正在使用很多。

编辑:我做了 Jon Skeet 建议的更改,问题就消失了。由于默认情况下将我的课程声明为公共的习惯,我遇到了这个问题。我要为其他正在做同样事情的人指出这一点。

// The internal class.
internal class JsonPetShelters
{

    [JsonProperty("@encoding")]
    public string Encoding { get; set; }

    [JsonProperty("@version")]
    public string Version { get; set; }

    [JsonProperty("petfinder")]
    public Petfinder Petfinder { get; set; }
}

// This method gets the inconsistent accessibility error since
//   JsonPetShelters is an internal class.
public JsonPetShelters GetShelters()
{
    // For example purposes only
    return null;
}

【问题讨论】:

    标签: c# public internal class-visibility


    【解决方案1】:

    解决这种情况的最佳方法是什么?

    您要么需要将JsonPetShelters 设为公开,要么将GetShelters() 设为内部。

    所以您希望能够从不同的程序集调用此方法?如果是这样,在不了解返回类型的情况下,您希望调用者如何使用它?如果不是,为什么方法是公开的?

    一旦您以一致的方式确定了您想要实现的目标,那么进行更改应该很简单。

    编辑:正如您所说,您只希望同一程序集中的代码能够调用该方法,只需将其更改为内部:

    internal JsonPetShelters GetShelters()
    { 
        ...
    }
    

    编译时错误将消失,您将不再公开您一开始不想公开的成员。

    【讨论】:

    • 我不想从不同的程序集中调用它,只能在同一个程序集中调用。但是我在同一个项目中的源文件之间遇到了这个错误。这是一个跨命名空间问题吗?请注意,我当然可以像你说的那样将课程公开,但是我也必须为 10 多个子课程这样做,所以我希望有其他选择。
    • @RobertOschler:只需将方法设为内部,一切都会好起来的。假设“那个错误”是指不一致的可访问性错误,你会从任何使用内部类型作为参数或返回类型的公共成员那里得到它。
    • 做到了。请参阅我对原始帖子的编辑,了解我最初参与此内容的原因。
    【解决方案2】:

    您可以显式声明类 Constructor 并将其设为内部,同时该类保持公开。

    这将允许每个程序集使用该类,但只有您的程序集可以创建实例。

    public class JsonPetShelters
    {
    
        [JsonProperty("@encoding")]
        public string Encoding { get; set; }
    
        [JsonProperty("@version")]
        public string Version { get; set; }
    
        [JsonProperty("petfinder")]
        public Petfinder Petfinder { get; set; }
    
        internal JsonPetShelters() {}
    }
    

    【讨论】:

    • 鉴于对我的回答的回应,OP 实际上想走相反的方向 - 保持类内部,但也使方法内部。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-12
    • 2014-07-25
    • 1970-01-01
    • 2013-12-13
    • 2011-04-28
    • 1970-01-01
    相关资源
    最近更新 更多