#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
orIEnumerable<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;
}
}
}
}