Why is internal protected not more restrictive than internal?

后端 未结 8 2134
陌清茗
陌清茗 2020-12-08 04:33

I\'d like to create an internal auto-property:

internal bool IP { get; protected internal set; }

I thought it would be possible to make the

相关标签:
8条回答
  • 2020-12-08 04:55

    protected internal is less restrictive than either protected or internal because it allows both its subclasses (protected) and anything in the same assembly (internal) to access something.

    0 讨论(0)
  • 2020-12-08 04:56

    Considering what Jon Skeet mentioned (and user59808's comment), wouldn't this achieve the desired result?

    protected internal bool IP { get; protected set; }

    0 讨论(0)
  • 2020-12-08 04:58

    It's effectively protected or internal, not and. It's accessible both by derived classes and types in the same assembly. It's a common misconception to think protected internal means accessible only to derived classes in the same assembly.

    0 讨论(0)
  • 2020-12-08 05:03

    accessibility modifier must be more restrictive than the property

    Internal is more restrictive that protected: because protected things can be seen (by subclasses) outside the assembly.

    The compiler is saying that there's no sense in saying that set is protected (i.e. visible to subclasses outside the assembly), when the whole IP property is internal (i.e. invisible outside the assembly).

    0 讨论(0)
  • 2020-12-08 05:04

    protected internal means protected OR internal, not protected and internal. So scope is limited to the same assembly OR derived classes, not necessarily both.

    0 讨论(0)
  • 2020-12-08 05:13

    At the .NET level, there are two similar but distinct access levels:

    • FamilyAndAssembly: more restrictive than either protected or internal
    • FamilyOrAssembly: less restrictive than either protected or internal

    "protected internal" in C# means FamilyOrAssembly; there's no modifier for FamilyAndAssembly.

    So, your protected internal setter is less restrictive than the internal overall property. What you could do is:

    protected internal bool IP { internal get; set; }
    

    But then your setter is less restricted than your getter, which is odd...

    Another (somewhat equivalent) alternative is:

    internal bool IP { get; set; }
    
    protected void SetIP(bool ip)
    {
        this.IP = ip;
    }
    
    0 讨论(0)
提交回复
热议问题