【问题标题】:Getting Inconsistent accessibility error获得不一致的可访问性错误
【发布时间】:2013-06-21 16:11:29
【问题描述】:

我遇到了一点问题,我似乎无法解决,谁能帮助我,
这些是错误:

错误 1 ​​可访问性不一致:字段类型 'Flashloader.Toepassing' 比字段更难访问 'Flashloader.NewApplication.Toepassing'

错误 2 可访问性不一致:参数类型 'Flashloader.toepassinginifile' 比方法更难访问 'Flashloader.NewApplication.NewApplication(Flashloader.toepassinginifile)'

因此,在这种情况下,那些错误但来源非常有用的地方。

Source 1 新应用程序(这是一个 Winform):

namespace Flashloader{

public partial class NewApplication : Form
{
    private toepassinginifile _toepassinginifile;

    //private controllerinifile _controlIniFile;

    public Toepassing toepassing = new Toepassing();

    public NewApplication(toepassinginifile iniFile)
    {
        _toepassinginifile = iniFile;

        InitializeComponent();
    }

    private void button4_Click(object sender, EventArgs e)
    {
        this.Close();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        openFileDialog1.Filter = "Srec Files (.a20; .a21; .a26; .a44)|*.a20; *.a21; *.a26; *.a44|All files (*.*)|*.*";

        openFileDialog1.Title = ("Choose a file");
        openFileDialog1.InitialDirectory = Path.Combine(Directory.GetCurrentDirectory());
        openFileDialog1.RestoreDirectory = true;
        if (openFileDialog1.ShowDialog() == DialogResult.OK)
        {
            fileBox.Text = (System.IO.Path.GetFileName(openFileDialog1.FileName));
        }
    }

    private void button3_Click(object sender, EventArgs e)
    {
        toepassing.Name = nameBox.Text;
        toepassing.Controller = controllerComboBox.SelectedItem;
        toepassing.TabTip = descBox.Text;
        toepassing.Lastfile = openFileDialog1.FileName;
        fileBox.Text = openFileDialog1.FileName;


        if (nameBox.Text == "")
            MessageBox.Show("You haven't assigned a Name");
        else if (controllerComboBox.Text == "")
            MessageBox.Show("You haven't assigned a Controller");
        else if (descBox.Text == "")
            MessageBox.Show("You haven't assigned a Desciption");
        else if (fileBox.Text == "")
            MessageBox.Show("You haven't assigned a Applicationfile");
        _toepassinginifile.ToePassingen.Add(toepassing);
        _toepassinginifile.Save();

        MessageBox.Show("Save Succesfull");



        this.Close();
    }

}}

来源 2 flashloader.toepassing 文件(这是一个类):

namespace Flashloader{
class Toepassing
{
    private String _name;

    public String Name
    {
        get { return _name; }
        set { _name = value; }
    }

    public Controller Controller = null;
    public String TabTip = "";
    public String Lastfile = "";

  [Obsolete]
  public String Baudrate = "";

  [Obsolete]
  public String Port = "";

  public String Useboot = "";

    public Toepassing()
    {
        Name = "";
    }

    public Toepassing(String naam)
    {
        Name = naam;
    }

    public override String ToString()
    {
        return Name + " :" + TabTip;
    }
}
}

最后是 source 3 flashloader.toepassinginifile(另一个类):

namespace Flashloader
{
class toepassinginifile
{
    private const String FILE_NAME = "flash.ini";
    private Controllerlist _controllers;
    public Toepassinglist ToePassingen { get; private set; }
    public Settings Settings { get; private set; }


    public toepassinginifile( Controllerlist controllers)
    {
        _controllers = controllers;

        // TODO Startup class maken en laden
        ToePassingen = LoadToepassingen();
    }

    private Toepassinglist LoadToepassingen()
    {
        StringList input = new StringList().FromFile( FILE_NAME );
        Toepassinglist output = new Toepassinglist();

        Settings settings = null;
        Toepassing toepassing = null;

        foreach (var item in input)
        {
            String line = item.Trim();

            if (line.StartsWith("[") && line.EndsWith("]"))
            {
                settings = null;
                toepassing = null;

                String name = line.Substring(1, line.Length - 2);

                if (name.ToUpper().Equals("STARTUP"))
                {
                    Settings = settings = new Settings();
                    continue;
                }
                // TODO kan weg in de toekomst
                if ( name.ToUpper().Equals("DRAG && DROP"))
                {
                    toepassing = null;
                    continue;
                } // */

                toepassing = new Toepassing(name);
                output.Add(toepassing);
            }
            else if (settings != null)
            {
                int index = line.IndexOf('=');
                if (index < 0)
                    continue;

                String key = line.Substring(0, index).Trim();
                String value = line.Substring(index + 1).Trim();

                if (Utils.EqualsIgnoreCase(key, "Baudrate"))
                    Settings.Baudrate = value;
                else if (Utils.EqualsIgnoreCase(key, "Port"))
                    Settings.Port = value;
            }
            else if (toepassing != null)
            {
                int index = line.IndexOf('=');
                if (index < 0)
                    continue;

                String key = line.Substring(0, index).Trim();
                String value = line.Substring(index + 1).Trim();

                if (Utils.EqualsIgnoreCase(key, "TabTip"))
                    toepassing.TabTip = value;
                else if (Utils.EqualsIgnoreCase(key, "Controller"))
                    toepassing.Controller = _controllers.FindByName(value);
                else if (Utils.EqualsIgnoreCase(key, "Lastfile"))
                    toepassing.Lastfile = value;
                else if (Utils.EqualsIgnoreCase(key, "Useboot"))
                    toepassing.Useboot = value;
            }
        }
        return output;
    }

    public void Save()
    {
        StringList list = new StringList();

        Toepassing settings = new Toepassing("[Startup]");

        list.Add("["+settings.Name+"]");
        list.Add("LastUsed=");
        list.Add("Port=" +settings.Port);
        list.Add("Baudrate=" +settings.Baudrate);

        foreach (Toepassing item in ToePassingen)
        {
            list.Add( "[" + item.Name + "]" );
            list.Add( "Controller=" + item.Controller.Name );
            list.Add( "TabTip="+ item.TabTip );
            list.Add("LastFile="+ item.Lastfile);
            list.Add("UseBoot="+ item.Useboot);
        }

        Toepassing dragndrop = new Toepassing("[Drag && Drop]");

            list.Add("["+dragndrop.Name+"]");
            list.Add("Autostart=");
            list.Add("Baudrate="+ dragndrop.Baudrate);
            list.Add("Port="+ dragndrop.Port);
            list.Add("Lasfile="+ dragndrop.Lastfile);

        list.ToFile(FILE_NAME);
    }
}
}

如果我能得到一些帮助,解决错误会容易得多。

已修复

【问题讨论】:

  • 你错过了重要的部分,我猜你还没有声明类public/internalpublic class Name
  • @Sayse 不错的答案^^ 运气不好,这是一条评论
  • @WhileTrueSleep - 我不喜欢整天通过解决非常简单的问题来获得声誉;)另外,我在工作时没有时间获得完整的答案:)跨度>
  • 详细的解释可能会有帮助。您的 NewApplicationClass 定义了一个公共属性 ToePassing ,这意味着有权访问 NewApplicationClass 的每个人也可以访问 Toepassing 但默认情况下 ToePassing 访问修饰符是 Internal 这意味着只能在程序集中访问它。所以在这里你与你想要的相矛盾(即一个地方你的意思是公共的,另一个地方你的意思是内部的)。所以编译器指出你,嘿!你错过了一些东西,同样适用于 toepassinginifile 类。

标签: c#


【解决方案1】:

由于toepassinginifile 用于public 类型的public 方法,它本身必须是public(当前为internal)。变化:

class toepassinginifile

到:

public class toepassinginifile

甚至更好;p

public class ToePassingIniFile

对于另一个也是如此,因为Toepassing 被用作public 类型上的public 字段,所以Toepassing 本身必须是public

最后的想法:public 字段很少是个好主意; public property 会更好:

private Toepassing toepassing = new Toepassing();
public Toepassing Toepassing  {get { return toepassing; } }

【讨论】:

  • 当我这样做时,我得到了 5 个额外的错误,然后其他功能将无法工作
  • 我很乐意为“更好”+2 :)
  • @Collin.Koornstra 很好,除非你告诉我 5 个额外的错误是什么,否则我无法评论
  • 好的,我删除了它们,但我会设法让它们回来
  • @Collin.Koornstra - 这你在这个问题中的错误指的是什么,你的新错误可能只是以前被掩盖的新的有效错误
【解决方案2】:

在你的类声明之前添加 public。 你的第一堂课是公开的,所以 Toepassinginifile 和 Toepassing 也必须是公开的。

【讨论】:

  • @Collin.Koornstra 实际上,这是问题的解决方案;我怀疑你的意思是“在我解决这个问题之前,还有其他问题不会被观察到” - 在这种情况下:你必须告诉我们 what,确切地说
【解决方案3】:

你得到的错误是说你将无法使用你的类中的公共方法,因为该类被标记为私有

默认类是内部的

class ClassName
{
public void Method()

上面会出错,因为类的可访问性比方法少,所以你永远不能调用方法

private bool Property {get; public set;}

可能也会出错

this

【讨论】:

  • 默认类是内部的但不是私有的
猜你喜欢
  • 1970-01-01
  • 2013-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多