WinForm点餐应用:为何仍触发‘因保护级别无法访问’错误?
问题分析与解决方案
我一眼就看出问题出在访问修饰符上——C#中默认的成员访问权限是private,这就导致你在AddMenu里根本没法访问GlobalCartList的cartList,以及TeaItem的teaName、teaSize字段。咱们一步步来修复:
1. 修复GlobalCartList类
你的cartList是私有字段,而且没有被标记为静态。既然要作为全局购物车,应该把它改成public static,这样不用实例化GlobalCartList就能直接访问:
public class GlobalCartList { // 改为public static,让外部类可以直接访问 public static List<TeaItem> cartList = new List<TeaItem>(); }
2. 修复TeaItem类
同样,teaName和teaSize默认是私有字段,外部类无法赋值。推荐用属性(带getter/setter)来封装,比直接暴露字段更符合C#的封装原则:
public class TeaItem { // 改为公共属性,或者直接用自动属性更简洁 public string TeaName { get; set; } public string TeaSize { get; set; } }
如果坚持用字段,也可以手动加public修饰符,但属性是更规范的写法。
3. 修复AddMenu中的代码
还有个小问题:你直接把addTeaNameLabel控件对象赋值给teaName了,应该取它的Text属性才对;另外SelectedItem需要转成字符串才能赋值给TeaSize:
public partial class AddMenu : UserControl { public AddMenu() { InitializeComponent(); } public void addToCart_Click(object sender, EventArgs e) { // 可选:加个空值判断,避免下拉框未选中时的异常 if (addSizeComboBox.SelectedItem == null) return; GlobalCartList.cartList.Add(new TeaItem() { TeaName = addTeaNameLabel.Text, TeaSize = addSizeComboBox.SelectedItem.ToString() }); } // 其他代码 }
这样修改后,各个类之间的访问权限就都打通了,你的购物车添加功能应该就能正常工作啦!
内容的提问来源于stack exchange,提问作者Maddy




