简体   繁体   English

由于保护级别而无法访问?

[英]Addrange Inaccessible due to protection level?

At somewhere cb.Items.AddRange(databases) there is inaccessibility due to protection level but all variables were set to public. 由于保护级别的缘故,在cb.Items.AddRange(databases)的某个位置无法访问,但是所有变量都设置为public。 Here it says: 它说:

C:\\Users\\Shulz\\Documents\\MySql\\Oliver exer3\\showdb.cs(77,18): error CS0122: `Sys tem.Windows.Forms.ComboBox.ObjectCollection.AddRange(System.Collections.IList)' is inaccessible due to its protection level C:\\PROGRA~2\\MONO-3~1.3\\lib\\mono\\4.5\\System.Windows.Forms.dll (Location of the sy mbol related to previous error) Compilation failed: 1 error(s), 0 warnings C:\\ Users \\ Shulz \\ Documents \\ MySql \\ Oliver exer3 \\ showdb.cs(77,18):错误CS0122:由于无法访问Sys tem.Windows.Forms.ComboBox.ObjectCollection.AddRange(System.Collections.IList)'到其保护级别C:\\ PROGRA〜2 \\ MONO-3〜1.3 \\ lib \\ mono \\ 4.5 \\ System.Windows.Forms.dll(与先前错误相关的sy mbol的位置)编译失败:1个错误, 0警告

    public ComboBox cb;
    public Label label;
    public object[] databases;

    public MForm() {

       string connectionString =
          "Server=localhost;" +
          "Database=information_schema;" +
          "User ID=root;" +
          "Password=root;" +
          "Pooling=false";
       IDbConnection dbcon;
       dbcon = new MySqlConnection(connectionString);
       dbcon.Open();
       IDbCommand dbcmd = dbcon.CreateCommand();

        string sql = "SELECT COUNT(*) as count FROM information_schema.SCHEMATA"; //count the databases(string) and names it count
        dbcmd.CommandText = sql;                        //sends the string to sql
        IDataReader reader = dbcmd.ExecuteReader();     //assign the function to reader
        reader.Read();                                  //uses its getter(Read)
        int count = Convert.ToInt32(reader["count"]);   //converts the "count"(column) to integer

        reader.Close();
        reader = null;
        dbcmd.Dispose();
        dbcmd = null;



        dbcmd = dbcon.CreateCommand();
        sql = "show databases";
        dbcmd.CommandText = sql;
        reader = dbcmd.ExecuteReader();

        var databases = new List<string>();

        var excludeDatabases = new List<string> { "information_schema","sakila","enrollmentsystem","mysql","world","performance_schema" };

        while(reader.Read())
        {
            var data = reader["Database"].ToString();

            if(!excludeDatabases.Contains(data)){
            databases.Add(data);
            }
        }

       reader.Close();
       reader = null;
       dbcmd.Dispose();
       dbcmd = null;
       dbcon.Close();
       dbcon = null;




        Text = "School Year";
        Size = new Size(340, 240);

        cb = new ComboBox();
        cb.Parent = this;
        cb.Location = new Point(50, 30);

        cb.Items.AddRange(databases);

        cb.SelectionChangeCommitted += new EventHandler(OnChanged);

        label = new Label();
        label.Location = new Point(80, 170);
        label.Parent = this;
        label.Text = "...";

        CenterToScreen();




    }

    void OnChanged(object sender, EventArgs e) {
         ComboBox combo = (ComboBox) sender;
         label.Text = combo.Text;
    }
}

A List<string> is not an object[] , so it's not compatible with AddRange and you get a compiler error. List<string>不是object[] ,因此它与AddRange不兼容,并且会出现编译器错误。

On .net this error is: 在.net上,此错误是:

The best overloaded method match for 'System.Windows.Forms.ComboBox.ObjectCollection.AddRange(object[])' has some invalid arguments 'System.Windows.Forms.ComboBox.ObjectCollection.AddRange(object[])'的最佳重载方法匹配具有一些无效的参数

Argument 1: cannot convert from 'System.Collections.Generic.List<string>' to 'object[]' 参数1:无法从'System.Collections.Generic.List<string>'转换为'object[]'

Mono seems to have another internal overload taking an IList . Mono似乎还有另一个内部重载采用IList If this overload were accessible, it'd match your call. 如果可以访问此重载,那么它将与您的呼叫匹配。 So the suggested cause for the error is a bit different. 因此,建议的错误原因有些不同。

In general the compiler first notices that there is no matching overload. 通常,编译器首先会注意到没有匹配的重载。 To help you, it tries to guess at the likely cause. 为了帮助您,它会尝试猜测可能的原因。 This guess can be affected by the presence of internal methods. 这种猜测可能会受到内部方法的影响。

I've figured out how to solve this problem. 我已经弄清楚了如何解决这个问题。 So what I did is db.ToArray() then assinged my databases which is object. 所以我要做的是db.ToArray()然后分配我的数据库对象。 It was just simple as that. 就这么简单。

    var db = new List<string>();

    var excludeDatabases = new List<string> { "information_schema","sakila","enrollmentsystem","mysql","world","performance_schema" };

    while(reader.Read())
    {
        var data = reader["Database"].ToString();

        if(!excludeDatabases.Contains(data)){
        db.Add(data);

        }
    }

   reader.Close();
   reader = null;
   dbcmd.Dispose();
   dbcmd = null;
   dbcon.Close();
   dbcon = null;




    Text = "School Year";
    Size = new Size(340, 240);

    cb = new ComboBox();
    cb.Parent = this;
    cb.Location = new Point(50, 30);


    databases = db.ToArray();
    cb.Items.AddRange(databases);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM