You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中定义internal类型的protected属性遇可访问性错误求解

解决C#中internal类型作为public类protected属性的访问性冲突问题

错误原因

你遇到的「Inconsistent accessibility」错误,核心是访问修饰符的范围不匹配:

  • protected internal的实际访问范围是当前程序集内的所有代码 + 任意程序集中的MyClass子类
  • 但InternalClass是internal,仅能在当前程序集内访问

如果其他程序集存在MyClass的子类,该子类能看到protected internal修饰的属性,但无法访问属性的类型InternalClass,这种矛盾的访问性被编译器禁止。

正确用法

根据需求(InternalClass为internal,在public类MyClass中定义类型为它的protected属性),需要限制属性的访问范围,确保只有能访问InternalClass的代码才能访问该属性,具体分两种场景:

场景1:仅允许当前程序集内的MyClass子类访问属性

使用private protected修饰属性(C# 7.2及以上版本支持),它的访问范围是当前程序集内的MyClass子类,完全匹配InternalClass的访问范围:

internal class InternalClass
{
    // 类实现代码
}

public class MyClass
{
    private protected InternalClass IC { get; set; }
}

// 当前程序集内的子类可正常访问
public class MyDerivedClass : MyClass
{
    public void AccessProperty()
    {
        var icInstance = IC; // 合法,满足当前程序集+子类的访问条件
    }
}

场景2:允许当前程序集内所有代码访问属性(含非子类)

如果需求是当前程序集内任意代码都能访问该属性,同时保留子类访问权限(仅限当前程序集内的子类),可以直接用internal修饰属性:

internal class InternalClass
{
    // 类实现代码
}

public class MyClass
{
    internal InternalClass IC { get; set; }
}

// 当前程序集内的任意代码都可访问
public class TestClass
{
    public void AccessProperty()
    {
        var myObj = new MyClass();
        var icInstance = myObj.IC; // 合法
    }
}

// 当前程序集内的子类也可访问
public class MyDerivedClass : MyClass
{
    public void AccessProperty()
    {
        var icInstance = IC; // 合法
    }
}

关键说明

不要混淆protected internal和private protected:

  • protected internal是「或」逻辑:满足子类或当前程序集即可访问
  • private protected是「与」逻辑:必须同时满足子类且当前程序集才能访问

前者会允许跨程序集的子类访问属性,而这些子类无法访问InternalClass,这就是报错的根源;后者则完美适配InternalClass的internal访问限制。

内容的提问来源于stack exchange,提问作者Hooman Bahreini

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 14:45:37