为了账号安全,请及时绑定邮箱和手机立即绑定

嵌套类 - 对所有人公开,仅为外部类设置

嵌套类 - 对所有人公开,仅为外部类设置

C#
MYYA 2022-10-23 13:46:16
如何设置修饰符?我想让嵌套类中的“get”为所有人公开,只为外部类设置?错误:索引器“Cart.CartItem.Quantity”的属性无法在此上下文中使用,因为设置访问器无法访问“Cart.CartItem.CartItem(Guid itemId, string name, decimal price, int quantity)”由于其保护级别而无法访问代码:public class Cart{    public List<CartItem> CartItems { get; private set; }    public int TotalQuantity => CartItems.Sum(x => x.Quantity);    public decimal TotalPrice => CartItems.Sum(x => x.Price * x.Quantity);    public Cart()    {        CartItems = new List<CartItem>();    }    public void AddItem(Guid itemId, string name, decimal price)    {        CartItem cartItem = CartItems.Find(x => x.ItemId == itemId);        if (cartItem != null)        {            cartItem.Quantity += 1;        }        else        {            CartItems.Add(new CartItem(itemId, name, price, 1));        }    }    public class CartItem    {        public Guid ItemId { get; private set; }        public string Name { get; private set; }        public int Quantity { get; private set; }        public decimal Price { get; private set; }        private CartItem(Guid itemId, string name, decimal price, int quantity)        {            ItemId = itemId;            Name = name;            Price = price;            Quantity = quantity;                    }    }}
查看完整描述

1 回答

?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

您没有完全遵循使用嵌套类型的原因。

嵌套类型可以访问封闭类型中定义的私有字段

查看有关Dos and Donts的链接

X 避免公开暴露的嵌套类型。唯一的例外是嵌套类型的变量只需要在极少数情况下声明,例如子类化或其他高级定制场景。

X 如果类型可能在包含类型之外被引用,则不要使用嵌套类型。

因此,正确的方法是保持类私有和成员公开,因此嵌套类型成员和字段只能由封闭类型访问

public class Cart {

    List<CartItem> CartItems { get; set; }

    public int TotalQuantity => CartItems.Sum(x => x.Quantity);

    public decimal TotalPrice => CartItems.Sum(x => x.Price * x.Quantity);


    public Cart() {

        CartItems = new List<CartItem>();

    }


    public void AddItem(Guid itemId, string name, decimal price) {

        CartItem cartItem = CartItems.Find(x => x.ItemId == itemId);


        if (cartItem != null) {

            cartItem.Quantity += 1;

        } else {

            CartItems.Add(new CartItem(itemId, name, price, 1));

        }

    }


    class CartItem {

        public Guid ItemId { get; set; }

        public string Name { get; set; }

        public int Quantity { get; set; }

        public decimal Price { get; set; }


        public CartItem(Guid itemId, string name, decimal price, int quantity) {

            ItemId = itemId;

            Name = name;

            Price = price;

            Quantity = quantity;

        }

    }

}


class Program {

    static void Main(string[] args) {

        var test = new Cart.CartItem(Guid.Empty, "", 0.0m, 10); // Error CS0122  'Cart.CartItem' is inaccessible due to its protection level 



    }

}


查看完整回答
反对 回复 2022-10-23
  • 1 回答
  • 0 关注
  • 82 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信