You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

WinForm点餐应用:为何仍触发‘因保护级别无法访问’错误?

问题分析与解决方案

我一眼就看出问题出在访问修饰符上——C#中默认的成员访问权限是private,这就导致你在AddMenu里根本没法访问GlobalCartListcartList,以及TeaItemteaNameteaSize字段。咱们一步步来修复:

1. 修复GlobalCartList

你的cartList是私有字段,而且没有被标记为静态。既然要作为全局购物车,应该把它改成public static,这样不用实例化GlobalCartList就能直接访问:

public class GlobalCartList
{
    // 改为public static,让外部类可以直接访问
    public static List<TeaItem> cartList = new List<TeaItem>();
}

2. 修复TeaItem

同样,teaNameteaSize默认是私有字段,外部类无法赋值。推荐用属性(带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

火山引擎 最新活动