Ошибка компиляции CS0305

#c#

#c#

Вопрос:

Я новичок в программировании на C # и столкнулся с проблемой, которую не могу преодолеть.

Я получаю эту ошибку компиляции:

CS0305: использование универсального типа ‘System.Коллекции.Общий.IEnumerable’ запрашивает аргументы типа 1

с помощью этого кода;

 class Program
    {
        static void Main(string[] args)
        {
            Car c = new Car();
            c.PetName = "Frank";
            c.Speed = 55;
            c.colour = "Green";

            Console.WriteLine("Name = : {0}", c.PetName);
            c.DisplayStats();

            Garage carLot = new Garage();

            // Hand over each car in the collection
            foreach (Car c in carLot)
            {
                Console.WriteLine("{0} is going {1} MPH",
                    c.PetName, c.CurrentSpeed);
            }

            Console.ReadLine();
        }

        class Car
        {
            //Automatic Properties
            public string PetName { get; set; }
            public int Speed { get; set; }
            public string colour { get; set; }

            public void DisplayStats()
            {
                Console.WriteLine("Car Name: {0}", PetName);
                Console.WriteLine("Speed: {0}", Speed);
                Console.WriteLine("Color: {0}", colour);
            }
        }

        public class Garage
        {
            private Car[] CarArray = new Car[4];

            // Fill with some car objects on startup.
            public Garage()
            {
                carArray[0] = new Car("Rusty", 30);
                carArray[1] = new Car("Clunker", 55);
                carArray[2] = new Car("Zippy", 30);
                carArray[3] = new Car("Fred", 30);
            }
        }

        public IEnumerator GetEnumerator()
        {
            foreach (Car c in carArray)
            {
                yield return c;
            }
        }

    }
  

Как я могу это решить?

Комментарии:

1. В этом коде чего-то не хватает: класс должен реализовать интерфейс IEnumerable or IEnumerable<T> , который будет использоваться в foreach инструкции. Я не вижу этого в классе Garage.

2. @Etienne, для ит более интуитивно реализовать один из этих интерфейсов, но это не обязательно. Достаточно иметь подходящий GetEnumerator метод. Смотрите раздел 8.8.4 спецификации языка C #, если это интересно.

3. @Anthony Интересно, не знал об этом. Опять же, в GetEnumerator классе нет Garage метода.

Ответ №1:

Существует два варианта IEnumerable , общий вариант (который находится в System.Collections.Generic пространстве имен) принимает аргумент type, который указывает типы объектов, которые содержит перечисляемый. Другой (содержащийся в System.Collections пространстве имен) не имеет аргумента type и поэтому предоставляет тип object — похоже, вы объявляете / используете нестандартный вариант, однако не используете System.Collections пространство имен.

Я думаю, что быстрый способ исправить вашу конкретную ошибку компиляции — поместить следующее в начало вашего файла исходного кода:

 using System.Collections;
  

В качестве альтернативы вы можете вместо этого использовать универсальную версию (что вы должны стараться делать везде, где это возможно, поскольку это безопасно для типов), указав параметры типа при объявлении IEnumerable , например:

  IEnumerable<Car>
 IEnumerator<Car>
  

Возможно, вы также захотите прочитать Введение в C # Generics

Похоже, у вас также есть еще несколько ошибок, но, похоже, что они могут быть вызваны проблемами с копированием и вставкой исходного кода (в частности, Garage не реализует IEnumerable ни универсальную, ни нестандартную версию и GetEnumerator относится к Program классу, а не к Garage classу).

Ответ №2:

У вас больше ошибок, чем просто это. Но конкретно для этой ошибки вы выполняете цикл Garage в foreach , но этот класс не предоставляет перечислитель, главным образом потому, что метод GetEnumerator фактически находится за пределами класса. Переместите метод внутрь Garage , и тогда вы сможете полностью перейти к сцене следующего сбоя.

На самом деле, для этой ошибки вам нужно, using System.Collections; а затем вам нужно переместить GetEnumerator метод. Как я уже сказал, в этом коде куча ошибок.

Комментарии:

1. @Tony, мы компьютерные программисты… мы существуем только для того, чтобы изменять сообщения об ошибках.

2. Спасибо, что очень помогли

Ответ №3:

У вас много опечаток. Как уже говорили другие, ваш конкретный ответ заключается в том, что вам нужно добавить «: IEnumerable» в ваш оператор class Garage.

Вот код, исправленный достаточно для чистой компиляции:

 class Program
{
    static void Main (string[] args)
    {
        Car c = new Car ("Frank", 55);
        c.colour = "Green";

        Console.WriteLine ("Name = : {0}", c.PetName);
        c.DisplayStats ();

        Garage carLot = new Garage ();

        // Hand over each car in the collection
        foreach (Car ch in carLot) {
            Console.WriteLine ("{0} is going {1} MPH", ch.PetName, ch.Speed);
        }

        Console.ReadLine ();
    }

    class Car
    {
        //Automatic Properties
        public string PetName { get; set; }
        public int Speed { get; set; }
        public string colour { get; set; }

        public void DisplayStats ()
        {
            Console.WriteLine ("Car Name: {0}", PetName);
            Console.WriteLine ("Speed: {0}", Speed);
            Console.WriteLine ("Color: {0}", colour);
        }

        public Car(string petname, int speed) { PetName = petname; Speed = speed; }
    }

    public class Garage : IEnumerable
    {
        private Car[] carArray = new Car[4];

        // Fill with some car objects on startup.
        public Garage ()
        {
            carArray[0] = new Car ("Rusty", 30);
            carArray[1] = new Car ("Clunker", 55);
            carArray[2] = new Car ("Zippy", 30);
            carArray[3] = new Car ("Fred", 30);
        }

        public IEnumerator GetEnumerator ()
        {
            foreach (Car c in carArray) {
                yield return c;
            }
        }

    }

}