C# 声明内部类型为(C)的公共类方法时出现不一致的可访问性错误?
我有一个JSON类对象,它是一个内部类。我希望保持这种方式,以防止其他代码尝试创建这种类型的对象,因为我只希望JSON反序列化代码能够做到这一点。我可以使用类类型作为变量,但是如果我尝试返回该类型的对象,我会得到一个不一致的accessibiliy编译器错误,因为该方法是公共的,而该类是内部的 解决这种情况的最佳方法是什么?我想我可以为内部类创建一个接口并传递它,但这意味着我必须为我正在使用的每个JSON类创建额外的包,而且我正在使用很多JSON类 编辑:我做了Jon Skeet建议的改变,问题就解决了。我陷入这个问题是因为我习惯于在默认情况下将我的类声明为公共类。我为其他做同样事情的人指出这一点C# 声明内部类型为(C)的公共类方法时出现不一致的可访问性错误?,c#,public,internal,class-visibility,C#,Public,Internal,Class Visibility,我有一个JSON类对象,它是一个内部类。我希望保持这种方式,以防止其他代码尝试创建这种类型的对象,因为我只希望JSON反序列化代码能够做到这一点。我可以使用类类型作为变量,但是如果我尝试返回该类型的对象,我会得到一个不一致的accessibiliy编译器错误,因为该方法是公共的,而该类是内部的 解决这种情况的最佳方法是什么?我想我可以为内部类创建一个接口并传递它,但这意味着我必须为我正在使用的每个JSON类创建额外的包,而且我正在使用很多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;
}
解决这种情况的最佳方法是什么
您要么需要将JSONPETSHEETS设置为公共的,要么将GetSHEETS设置为内部的
因此,您希望能够从其他程序集调用此方法?如果是这样,在不了解返回类型的情况下,您希望调用方如何使用它?如果不是,为什么该方法是公开的
一旦你以一致的方式确定了你想要实现的目标,做出改变应该很简单
编辑:正如您所说,您只希望同一程序集中的代码能够调用该方法,只需将其更改为内部:
internal JsonPetShelters GetShelters()
{
...
}
编译时错误将消失,您将不再公开一个最初不想公开的成员
解决这种情况的最佳方法是什么
您要么需要将JSONPETSHEETS设置为公共的,要么将GetSHEETS设置为内部的
因此,您希望能够从其他程序集调用此方法?如果是这样,在不了解返回类型的情况下,您希望调用方如何使用它?如果不是,为什么该方法是公开的
一旦你以一致的方式确定了你想要实现的目标,做出改变应该很简单
编辑:正如您所说,您只希望同一程序集中的代码能够调用该方法,只需将其更改为内部:
internal JsonPetShelters GetShelters()
{
...
}
编译时错误将消失,您将不再公开最初不想公开的成员。您可以显式声明类构造函数并将其设置为内部,同时类保持公共
这将允许每个程序集使用该类,但只有您的程序集可以创建实例
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() {}
}
您可以显式声明类构造函数并使其成为内部构造函数,同时类保持公共
这将允许每个程序集使用该类,但只有您的程序集可以创建实例
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() {}
}
我不想从不同的程序集中调用它,只想在同一个程序集中调用它。但是我在同一个项目的源文件之间遇到了这个错误。这是一个跨命名空间的问题吗?注意,我当然可以像你所说的那样将这个类公开,但是我也必须为10+个儿童类公开,所以我希望有其他的选择。@RobertOschler:只要将这个方法内部化,一切都会好的。假设该错误指的是不一致的可访问性错误,那么您将从任何使用内部类型作为参数或返回类型的公共成员处获得该错误。请参阅我对我的原始帖子的编辑,了解我为什么首先进入这个程序集。我不想从其他程序集调用它,只想在同一程序集中调用它。但是我在同一个项目的源文件之间遇到了这个错误。这是一个跨命名空间的问题吗?注意,我当然可以像你所说的那样将这个类公开,但是我也必须为10+个儿童类公开,所以我希望有其他的选择。@RobertOschler:只要将这个方法内部化,一切都会好的。假设该错误指的是不一致的可访问性错误,那么您将从任何使用内部类型作为参数或返回类型的公共成员处获得该错误。请参阅我对我的原始帖子的编辑,我首先解释了为什么我会这样做。鉴于对我答案的回应,OP实际上想走相反的方向——保持类内部,但也使方法内部。鉴于对我答案的回应,OP实际上想走相反的方向——保持类内部,同时也使方法内部化。