如何解决不一致的可访问性错误

时间:2019-03-27 14:33:00

标签: c# winforms

我们正在制作产品发票表-提供产品编号,描述和价格。我似乎无法使其合作。我仔细检查并确保InvItem的类是公共的,但仍给我相同的错误代码CS0050

 Inconsistent accessibility: return type 'List<InvIte>' is less accessible than method InvItemDB.GetItems()' 

我已经遍历了代码,并确保它与我的教科书匹配,并且所有类都是公共的。 这只是我的代码的一部分-不是全部4或5种形式。如果需要,我也可以显示这些内容,但这是发出错误消息的地方。

public partial class frmNewItem : Form
{
    public frmNewItem()
    {
        InitializeComponent();
    }

    private InvItem item = null;

    public InvItem GetNewItem()
    {
        this.ShowDialog();
        return item;
    }



    private void btnSave_Click(object sender, EventArgs e)
    {
        if (IsValidData())
        {
            item = new InvItem(txtItemNo.Text, txtDescription.Text, Convert.ToDecimal(txtPrice));
            this.Close();
        }
    }
 private bool IsValidData()
    {
        return Validator.IsPresent(txtItemNo) &&
               Validator.IsInt32(txtItemNo) &&
               Validator.IsPresent(txtDescription) &&
               Validator.IsPresent(txtPrice) &&
               Validator.IsDecimal(txtPrice);
    }

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

InvItem代码:

class InvItem
{
    public string itemno;
    public string description;
    public decimal price;

    public InvItem()
    {
    }

    public InvItem(string itemno, string description, decimal price)
    {
        this.ItemNo = itemno;
        this.Description = description;
        this.Price = price;
    }

    public string ItemNo
    {
        get{return itemno;}
        set { itemno = value; }

    }

    public string Description
    {
        get { return description; }
        set { description = value; }
    }

    public decimal Price
    {
        get { return price; }
        set { price = value; }
    }

    public string GetDisplayText()
    {
        return itemno + ", " + price.ToString("c") + ", " + description;
    }

    public string GetDisplayText(string sep)
    {
        return itemno + sep + price.ToString("c") + sep + description;
    }

主要形式:

  public partial class frmInvMaint : Form
{

    public frmInvMaint()
    {
        InitializeComponent();
    }

    private List<InvItem> products = null;


    private void frmInvMaint_Load(object sender, EventArgs e)
    {
        products = InvItemDB.GetItems();
        FillItemListBox();
    }

    private void FillItemListBox()
    {
        lstItems.Items.Clear();
        foreach (InvItem p in products)
        {
            lstItems.Items.Add(p.GetDisplayText("\t"));
        }
    }

    private void btnAdd_Click(object sender, EventArgs e)
    {
        frmNewItem newItemForm = new frmNewItem();
        InvItem product = newItemForm.GetNewItem();
        if (product != null)
        {
            products.Add(product);
            InvItemDB.SaveItems(products);
            FillItemListBox();
        }
            }

    private void btnDelete_Click(object sender, EventArgs e)
    {
        int i = lstItems.SelectedIndex;
        if (i != -1)
        {
            InvItem product = (InvItem)products[i];
            string message = "Are you sure you want to delete " + product.Description + "?";
            DialogResult button =
                MessageBox.Show(message, "Confirm Delete", MessageBoxButtons.YesNo);

            if (button == DialogResult.Yes)
            {
                products.Remove(product);
                InvItemDB.SaveItems(products);
                FillItemListBox();

            }
        }
    }

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

InvItemDB代码:

  public static class InvItemDB
{
    private const string Path = @"..\..\InventoryItems.xml";

    public static List<InvItem> GetItems()
    {
        // create the list
        List<InvItem> items = new List<InvItem>();

        // create the XmlReaderSettings object
        XmlReaderSettings settings = new XmlReaderSettings();
        settings.IgnoreWhitespace = true;
        settings.IgnoreComments = true;

        // create the XmlReader object
        XmlReader xmlIn = XmlReader.Create(Path, settings);

        // read past all nodes to the first Book node
        if (xmlIn.ReadToDescendant("Item"))
        {
            // create one Product object for each Product node
            do
            {
                InvItem item = new InvItem();
                xmlIn.ReadStartElement("Item");
                item.ItemNo = Convert.ToString(xmlIn.ReadElementContentAsInt());
                item.Description = xmlIn.ReadElementContentAsString();
                item.Price = xmlIn.ReadElementContentAsDecimal();
                items.Add(item);
            }
            while (xmlIn.ReadToNextSibling("Item"));
        }

        // close the XmlReader object
        xmlIn.Close();

        return items;
    }

    public static void SaveItems(List<InvItem> items)
    {
        // create the XmlWriterSettings object
        XmlWriterSettings settings = new XmlWriterSettings();
        settings.Indent = true;
        settings.IndentChars = ("    ");

        // create the XmlWriter object
        XmlWriter xmlOut = XmlWriter.Create(Path, settings);

        // write the start of the document
        xmlOut.WriteStartDocument();
        xmlOut.WriteStartElement("Items");

        // write each product object to the xml file
        foreach (InvItem item in items)
        {
            xmlOut.WriteStartElement("Item");
            xmlOut.WriteElementString("ItemNo", Convert.ToString(item.ItemNo));
            xmlOut.WriteElementString("Description", item.Description);
            xmlOut.WriteElementString("Price", Convert.ToString(item.Price));
            xmlOut.WriteEndElement();
        }

        // write the end tag for the root element
        xmlOut.WriteEndElement();

        // close the xmlWriter object
        xmlOut.Close();
    }

xml项目列表:

<Items>
    <Item>
       <ItemNo>3245649</ItemNo>
    <Description>Agapanthus</Description>
    <Price>7.95</Price>
</Item>
<Item>
    <ItemNo>3762592</ItemNo>
    <Description>Limonium</Description>
    <Price>6.95</Price>
</Item>
<Item>
    <ItemNo>9210584</ItemNo>
    <Description>Snail pellets</Description>
    <Price>12.95</Price>
</Item>
<Item>
    <ItemNo>4738459</ItemNo>
    <Description>Japanese Red Maple</Description>
    <Price>89.95</Price>
   </Item>
</Items>

我只需要显示一个对话框,这样我就可以输入商品编号,描述和价格,并将其保存到新列表中。

1 个答案:

答案 0 :(得分:1)

下次,请显示失败的实际代码。您的错误消息与您显示的代码不匹配;该代码中没有GetItems方法,并且封闭类型不是InvItemDB显示失败的代码,而不是不相关的代码

我的精神力量告诉我:

  • 类型InvItem是内部的(请记住,如果您对非嵌套类型声明说什么都不是“内部”,则默认可访问性。)
  • 方法InvItemDB.GetItems()(可能应该是只读属性)是公共类的公共方法。

这是不一致的;您不能在用于返回仅内部项目列表的公共类上使用public方法。不允许调用者知道仅内部类型的存在!

要解决此问题,请消除不一致之处。将GetItems设置为内部,或将InvItem设置为公开。

  

我已经仔细检查并确保InvItem的类是公共的,但仍然给我同样的错误

然后进行干净的重建,看看是否能解决问题。 确保您没有两种都称为InvItem的类型。


更新:您都说过:

“我已经检查并确保InvItem的类是公共的”

class InvItem { ... }

所以不,您没有“确保班级是公开的”。那应该是

public class InvItem { ... }

此问题应关闭并删除。