相同的程序集但内部访问器导致错误

时间:2014-12-09 16:05:26

标签: c# properties .net-assembly access-modifiers accessor

我想在属性Length和Width中使用内部访问修饰符,但这是不可能的。它会导致错误。然后在main方法中,当我想使用WriteLine方法时,不可能从这个属性中获取值。问题是为什么?我是同一个集会,还是?

namespace AbstractPolygon
{
    abstract internal class Polygon
    {
        public double Length { get; protected set; }
        public double Width { get; protected set; }

        abstract internal double GetArea();
    }

    internal class Rectangle:Polygon
    {
        internal Rectangle(double length,double width)
        {
            Length = length;
            Width = width;           
        }

        override internal double GetArea()
        {
            return Length * Width;
        }
    }

    internal class Square:Polygon
    {

        internal Square(double length)
        {
            Length = length;
        }

        override internal double GetArea()
        {
            return Length * Length;
        }
    }

    internal class Program
    {
        static void Main(string[] args)
        {
            Rectangle objRectangle = new Rectangle(15,5);
            Square objSquare = new Square(97);

            Console.WriteLine("Rectangle area of length:{0} and width:{1} is: {2}",
                objRectangle.Length, objRectangle.Width, objRectangle.GetArea());
            Console.WriteLine("Square area of length:{0} is: {1}", objSquare.Length,
                objSquare.GetArea());
        }
    }
}

1 个答案:

答案 0 :(得分:1)

您收到编译错误

  

'AbstractPolygon.Polygon.Length.set'访问器的辅助功能修饰符必须比属性或索引器'AbstractPolygon.Polygon.Length'更具限制性。

protected(应用于setter)意味着此setter对派生类是可见的,即使这些类在另一个程序集中,但属性的internal修饰符也禁止这样做。设置器上的访问修饰符仅允许限制访问,但不允许扩展它。这就是C#抱怨的原因。显然,在做出这个决定时,C#不会查看班级的internal修饰符。

但是,您不需要在内部创建成员,因为无论如何,类(及其成员)都不会在其他程序集中可见。让会员公开,这不是安全威胁。