C# 如何定义仅在类库项目中使用的类的范围?

C# 如何定义仅在类库项目中使用的类的范围?,c#,oop,class,scope,visibility,C#,Oop,Class,Scope,Visibility,我有一个带有一些公共类和许多内部实用程序类的类库。这些实用程序不应该对链接DLL的用户可见/可用 namespace MyProject { public class PublicClass { } } namespace MyProject { internal class UtilClass { } } 当我这样做时,VS会触发错误,例如“UtilClass比PublicClass.Member更难访问” 我做错什么了吗?我应该怎么做?我见过一些库中有我不能使用的私有类。我

我有一个带有一些公共类和许多内部实用程序类的类库。这些实用程序不应该对链接DLL的用户可见/可用

namespace MyProject {
    public class PublicClass { }
}
namespace MyProject {
    internal class UtilClass { }
}
当我这样做时,VS会触发错误,例如“UtilClass比PublicClass.Member更难访问”

我做错什么了吗?我应该怎么做?我见过一些库中有我不能使用的私有类。我如何获得这种行为


谢谢。

您的错误很常见。例如,如果您有两个类:

public class PublicClass { ... }

这将不会返回任何错误。但是如果您添加PublicClass a属性,如

public PrivateClass MyProperty { ... } 

你会得到一个错误。因为该属性对于库的用户是可见的,但是属性的类型是不可见的

你的错误很常见。例如,如果您有两个类:

public class PublicClass { ... }

这将不会返回任何错误。但是如果您添加PublicClass a属性,如

public PrivateClass MyProperty { ... } 

你会得到一个错误。因为该属性对于库的用户是可见的,但是属性的类型是不可见的

这意味着您的
PublicClass
中有public类型为
UtilClass
的成员。编译器不允许这样做,因为外部程序集可以访问公共成员,但成员本身的类型是内部的,因此不可访问


将该成员设置为内部成员而不是公共成员。

这意味着您的
公共类中有一个public类型为
UtilClass
的成员。编译器不允许这样做,因为外部程序集可以访问公共成员,但成员本身的类型是内部的,因此不可访问


将该成员设置为内部成员,而不是公共成员。我怀疑您没有向我们展示完整的代码,因为您提供的代码应该是有效的

您必须有一个公共方法或属性来返回内部类的实例,例如

namespace MyProject 
{
    public class PublicClass 
    {
        public UtilClass DoSomething() {} 
        public UtilClass { get; }
        // External assemblies cannot see the UtilClass  type which is
        // why this does not work.
    }
}
这显然无法完成,因为外部程序集需要了解它

如果你真的需要一个公开行为而不暴露内部类型的公共属性,那么考虑一个实用工具类可以实现的接口。 这将允许您将helper类保持在内部,但仍然(通过接口)将其公开给外部程序集

internal class UtilClass : IMyPublicInterface 
{ 
}

namespace MyProject 
{
    public class PublicClass 
    {
        public IMyPublicInterface DoSomething() {} 
        public IMyPublicInterface { get; }
        // External assemblies now only need to know about the public interface.
    }
}

我怀疑您没有向我们展示完整的代码,因为您所提供的应该是有效的

您必须有一个公共方法或属性来返回内部类的实例,例如

namespace MyProject 
{
    public class PublicClass 
    {
        public UtilClass DoSomething() {} 
        public UtilClass { get; }
        // External assemblies cannot see the UtilClass  type which is
        // why this does not work.
    }
}
这显然无法完成,因为外部程序集需要了解它

如果你真的需要一个公开行为而不暴露内部类型的公共属性,那么考虑一个实用工具类可以实现的接口。 这将允许您将helper类保持在内部,但仍然(通过接口)将其公开给外部程序集

internal class UtilClass : IMyPublicInterface 
{ 
}

namespace MyProject 
{
    public class PublicClass 
    {
        public IMyPublicInterface DoSomething() {} 
        public IMyPublicInterface { get; }
        // External assemblies now only need to know about the public interface.
    }
}

听起来您在
PublicClass
中有类型为
UtilClass
protected
public
成员。将该成员的可视性降低到
内部
。您的代码应按原样编译。此代码未演示问题,请发布其余代码。然而,CodesInChaos的建议很可能是原因。作为参考,将来如果你能够发布所有代码,人们回答你的问题会更容易。我这么说是因为正如@CodesInChaos所说的,您发布的代码是编译的。这有意义吗?听起来您在
PublicClass
中有一个
protected
public
类型的
UtilClass
成员。将该成员的可视性降低到
内部
。您的代码应按原样编译。此代码未演示问题,请发布其余代码。然而,CodesInChaos的建议很可能是原因。作为参考,将来如果你能够发布所有代码,人们回答你的问题会更容易。我这么说是因为正如@CodesInChaos所说的,您发布的代码是编译的。这有意义吗?