Работа со списками C # - PullRequest
       31

Работа со списками C #

0 голосов
/ 15 марта 2011

Я пытаюсь понять, как списки работают в C #, но я не могу запустить свое приложение, потому что я получаю эти сообщения:

Ошибка 1 Несовместимая доступность: тип свойства 'ClaseLista.ListNode'менее доступно, чем свойство 'ClaseLista.List.PrimerNodo' C: \ Documents and Settings \ Usuario \ Escritorio \ Listas \ ClaseLista \ List.cs 19 25 ClaseLista


Ошибка 2 Несоответствующая доступность: тип свойства 'ClaseLista.ListNode 'менее доступен, чем свойство' ClaseLista.List.UltimoNodo 'C: \ Documents and Settings \ 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 ]

4 голосов
/ 15 марта 2011

Вам также нужно сделать общедоступным ListNode ...

public class ListNode
2 голосов
/ 15 марта 2011

это просто проблема, связанная с видимостью вашего ListNode класса - который объявлен как

class ListNode

(И, следовательно, имеет internal видимость)

Принимая во внимание, что ваш List класс объявлен как

public class List

Поскольку List затем объявляет одно или несколько открытых свойств типа ListNode, ListNode также должно быть открытым:

public class ListNode

Исправит это.

1 голос
/ 15 марта 2011

Это потому, что вы ListNode определены как:

namespace ClaseLista
{
    class ListNode
    {

По умолчанию компилятор предоставляет доступ internal. Чтобы избавиться от ошибки, измените это на общедоступное:

namespace ClaseLista
{
    public class ListNode
    {

Это необходимо, поскольку вы определяете часть вашего публичного API , используя класс ListNode:

// This can't be public unless "ListNode" is public as well!
public ListNode PrimerNodo
{
    get { return primerNodo; }
    set { primerNodo = value; }
}
1 голос
/ 15 марта 2011

Проблема в том, что ваш класс ListNode является внутренним, а класс List общедоступным.Код вне вашей сборки .NET может обращаться к классу List, но они не могут использовать свойства PrimerNodo или UltimoNodo, если только они не могут обращаться к классу ListNode, поэтому компилятор выдаст вам эту ошибку.

Если вы хотите, чтобы код вне вашей сборки имел доступ к ListNode, вы можете сделать его общедоступным.В противном случае вы можете изменить модификатор доступа класса List на внутренний или изменить модификатор доступа свойств, которые используют ListNode, на закрытый или внутренний.

0 голосов
/ 15 марта 2011

Ваши свойства типа ListNode в классе ClaseLista равны public, но сам тип ListNode не является общедоступным. Это создает взаимоисключающий контроль доступа для компилятора. (В конце концов, клиент-потребитель не может очень хорошо использовать свойство, не имея возможности использовать тип для этого свойства.)

Чтобы эти свойства были общедоступными, класс ListNode также должен быть общедоступным.

0 голосов
/ 15 марта 2011

Сделать ListNode общедоступным:

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