【问题标题】:How to pass generic list as constructor?如何将通用列表作为构造函数传递?
【发布时间】:2016-10-22 12:14:22
【问题描述】:

我是 C# 新手。我来自 Java。

在 Java 中,我通常在构造函数中传递具有数据类型的 ArrayList。 在 C# 中,ArrayList 似乎不能接受数据类型,只有 List 可以做到。

所以我有这个表格,它从其他表格中获取列表

namespace Test
{
    public partial class Form2 : Form
    {
        private List<TestData> list;

        public Form2 (List<TestData> _list)
        {
            InitializeComponent();
            this.list = _list;
        }
    }
}

如果我这样做了,我会得到类似的错误

可访问性不一致:参数类型难以访问..

我尝试将私人列表更改为公开,但出现更多错误

可访问性不一致:字段类型难以访问..

如果我将列表更改为 ArrayList。它正在工作。 C#中不能把List放在构造函数中吗?

【问题讨论】:

  • 你确定List 引起了问题吗。我看到上面的代码工作得很好。除了一个小的命名约定之外没有问题。检查TestData 类及其使用的属性是否可以访问.

标签: c# winforms arraylist .net-3.5


【解决方案1】:

我认为问题不在于Form2 类。看起来不错。错误消息说 Inconsistent accessibility:.. 并且您正在访问里面的类 TestData 。所以你必须检查TestData的定义并确认它被定义为public class TestData

【讨论】:

  • 谢谢!我不知道默认情况下该课程不是“公共”的。我稍后会接受答案:)
【解决方案2】:
namespace Test
{
    public partial class Form2 : Form
    {
        private List<TestData> _list;
        public Form2 (List<TestData> list)
        {
            InitializeComponent();
            this._list = list;
        }
    }
}

检查 'TestData' 是私有的还是公有的,并按照上面的代码重命名私有变量

【讨论】:

  • 检查“TestData”是私有的还是公共的
【解决方案3】:

您需要将您的 TestData 更改为公开

public class TestData
{

}

如果TestDatainternal(如果您写了class TestData,则为默认值)或private,这意味着它比公共构造函数更难访问,这就是错误你正在阅读的。

所以你有一个任何人都可以访问的构造函数,使用的是受限制的类型。这是不允许的。

【讨论】:

    【解决方案4】:

    我建议使用以下示例并与您的代码进行比较,并声明其他构造函数和使用。

    using System.Collections.Generic;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            private List<Test> _property;
    
            public Form1()
            {
                InitializeComponent();
            }
            public Form1(List<Test> valueList)
            {
                _property = valueList;
                InitializeComponent();
            }
        }
    
        public class Test
        {
            public int Id { get; set; }
            private string Name { get; set; }
        }
    }
    

    其他形式:

    using System.Collections.Generic;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
        public partial class Form2 : Form
        {
            public Form2()
            {
                InitializeComponent();
                // Default Constractor.
                new Form1();
                // Secound Constractor.
                new Form1(new List<Test>());
            }
        }
    }
    

    提示:测试类必须是公共类。

    【讨论】:

      猜你喜欢
      • 2015-02-22
      • 1970-01-01
      • 2022-12-17
      • 2015-08-02
      • 2016-07-19
      • 2014-08-13
      • 2017-03-17
      • 1970-01-01
      • 2011-06-28
      相关资源
      最近更新 更多