Windows Forms中传递List<curso>及解决可访问性不一致错误
解决Windows Forms中集合传递的可访问性不一致问题
这个错误的根源其实很清晰——可访问性不匹配,咱们一步步来搞定它:
错误原因拆解
你写的curso类没有显式添加访问修饰符,在C#里,类默认的访问级别是internal(只能在当前程序集内部访问)。但你的aCurso窗体构造函数是public的,它的参数是List<curso>——这就产生了矛盾:一个对外公开的public方法(构造函数),却使用了一个访问级别更低的类型作为参数。编译器会认为:如果外部程序集想调用这个构造函数,根本无法识别curso类型,所以直接抛出了这个错误。
两种可行的解决方案
方案一:将curso类改为public访问级别
这是最通用的解决方式,适合后续可能需要在其他程序集访问curso类的场景。只需要给curso类加上public修饰符即可:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _18_05_18 { public class curso // 添加public修饰符 { private string nombre; public curso(string nombre) { this.nombre = nombre; } } }
方案二:将aCurso的构造函数改为internal访问级别
如果你的整个逻辑都只在当前程序集内运行,不需要外部程序集调用aCurso的构造函数,可以把构造函数的访问级别改成internal,和curso类的默认级别保持一致:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace _18_05_18 { public partial class aCurso : Form { List<curso> cursos = new List<curso>(); // 将public改为internal internal aCurso(List<curso> cursos) { InitializeComponent(); this.cursos = cursos; } } }
验证修改效果
两种方案修改完成后,你原来Form1里的调用代码不需要任何改动,就能正常把List<curso>集合传递给aCurso窗体了:
private void btnAC_Click(object sender, EventArgs e) { Form f = new aCurso(cursos); f.Show(); }
简单总结一下:核心就是保证方法(构造函数)的访问级别,不能高于它所使用的参数类型的访问级别,两者匹配就不会再出现这个错误啦。
内容的提问来源于stack exchange,提问作者José
相关产品推荐
相关产品推荐

