使用C#列表

时间:2011-03-15 17:26:00

标签: c# class list compiler-errors

我正在尝试了解列表如何在C#中运行,但我无法运行我的应用程序,因为我收到了这些消息:

  

错误1可访问性不一致:   属性类型'ClaseLista.ListNode'是   比财产更容易接近   'ClaseLista.List.PrimerNodo'C:\ Documents   和   设置\ Usuario \ Escritorio \ Listas \ ClaseLista \ List.cs 19 25 ClaseLista

     
     

错误2可访问性不一致:   属性类型'ClaseLista.ListNode'是   比财产更容易接近   'ClaseLista.List.UltimoNodo'C:\ Documents   和   设置\ Usuario \ Escritorio \ Listas \ ClaseLista \ List.cs 24 25 ClaseLista

     
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using ClaseLista;

namespace Listas
{
    class Program
    {
        static void Main(string[] args)
        {
            List Lista1 = new List();
            int opcion = 1;
            while (opcion > 0 && opcion < 3)
            {
                Console.WriteLine("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
                Console.WriteLine("x Menú Principal (dos datos) x");
                Console.WriteLine("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
                Console.WriteLine("x                            x");
                Console.WriteLine("x 1: Insertar Alumnos        x");
                Console.WriteLine("x 2: Imprimir Lista          x");
                Console.WriteLine("x 3: Salir                   x");
                Console.WriteLine("x                            x");
                Console.WriteLine("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
                Console.Write("Ingrese opción: ");
                opcion = int.Parse(Console.ReadLine());
                switch (opcion)
                {
                    case 1: int numero; string nombre, codigo;
                        Console.Write("Ingrese número de elementos: ");
                        numero = int.Parse(Console.ReadLine());
                        for (int i = 1; i <= numero; i++)
                        {
                            Console.WriteLine("Datos del alumno " + i);
                            Console.Write("Ingrese Nombre: ");
                            nombre = (Console.ReadLine());
                            Console.Write("Ingrese Codigo: ");
                            codigo = (Console.ReadLine());
                            Lista1.InsertaInicio(nombre, codigo);
                        }
                        break;
                    case 2:
                        if (Lista1.EsVacio())
                        {
                            Console.WriteLine("Lista Vacia");
                        }
                        else
                        {
                            Lista1.Imprimir();
                        }
                        break;
                }
            }
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ClaseLista
{
    public class List
    {
        //Constructor
        private ListNode primerNodo;
        private ListNode ultimoNodo;
        public List()
        {
            primerNodo = null;
            ultimoNodo = null;
        }
        //Propiedades
        public ListNode PrimerNodo
        {
            get { return primerNodo; }
            set { primerNodo = value; }
        }
        public ListNode UltimoNodo
        {
            get { return ultimoNodo; }
            set { ultimoNodo = value; }
        }
        //insertar al inicio
        public void InsertaInicio(object nom, object cod)
        {
            if (EsVacio())
                primerNodo = ultimoNodo = new ListNode(nom, cod, null);
            else
            {
                primerNodo = new ListNode(nom, cod, primerNodo);
            }
        }
        //comprobar si es vacio
        public bool EsVacio()
        {
            return primerNodo == null;
        }
        //Imprimir
        public void Imprimir()
        {
            ListNode current = primerNodo;
            while (current != null)
            {
                Console.WriteLine("|" + current.Nombre + " " + current.Codigo);
                current = current.Siguiente;
            }
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ClaseLista
{
    class ListNode
    {
        //Constructor
        private object nombre;
        private object codigo;
        private ListNode siguiente;
        public ListNode()
        {
            nombre = null;
            codigo = null;
            siguiente = null;
        }
        public ListNode(object nomb, object cod, ListNode sig)
        {
            nombre = nomb;
            codigo = cod;
            siguiente = sig;
        }
        //Propiedades
        public object Nombre
        {
            get { return nombre; }
            set { nombre = value; }
        }
        public object Codigo
        {
            get { return codigo; }
            set { codigo = value; }
        }
        public ListNode Siguiente
        {
            get { return siguiente; }
            set { siguiente = value; }
        }
    }
}

我该怎么办?

6 个答案:

答案 0 :(得分:4)

您还需要公开ListNode ...

public class ListNode

答案 1 :(得分:2)

这只是一个与ListNode类的可见性有关的问题 - 它被声明为

class ListNode

(因此internal知名度)

而您的List类被声明为

public class List

因为List会声明一个或多个ListNode类型的公共属性,ListNode也必须公开:

public class ListNode

将修复它。

答案 2 :(得分:1)

问题是,您的ListNode课程是内部的,而您的List课程是公开的。 .NET程序集之外的代码可以访问List类,但除非他们也可以访问PrimerNodo类,否则他们不能使用UltimoNodoListNode属性,因此编译器会给你这个错误。

如果您希望程序集之外的代码能够访问ListNode,则可以将其公开。否则,您可以将List类的访问修饰符更改为内部,或将使用ListNode的属性的访问修饰符更改为私有或内部。

答案 3 :(得分:1)

这是因为您将ListNode定义为:

namespace ClaseLista
{
    class ListNode
    {

默认情况下,编译器为此提供internal辅助功能。要摆脱错误,请将其更改为公开:

namespace ClaseLista
{
    public class ListNode
    {

这是必需的,因为您使用ListNode类定义了部分公共API

// This can't be public unless "ListNode" is public as well!
public ListNode PrimerNodo
{
    get { return primerNodo; }
    set { primerNodo = value; }
}

答案 4 :(得分:0)

将ListNode公开:

namespace ClaseLista
{
   public class ListNode
   {
      //Constructor
      private object nombre;
      ..

答案 5 :(得分:0)

ListNode中类型ClaseLista的属性为public,但ListNode类型本身不公开。这为编译器创建了互斥的访问控制。 (毕竟,消费客户端不能很好地使用属性而不能使用该属性的类型。)

要使这些属性公开,ListNode类也需要公开。