编译错误CS0305

本文关键字:CS0305 错误 编译 | 更新日期: 2023-09-27 17:54:33

我是c#编程新手,遇到了一个无法克服的障碍。

我得到这个编译错误:

CS0305:使用泛型类型System.Collections.Generic。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;
            }
        }
    }

如何解决这个问题?

编译错误CS0305

IEnumerable有两个变体,泛型(在System.Collections.Generic名称空间中)接受一个类型参数,该参数指定了可枚举对象包含的对象类型。另一个(包含在System.Collections名称空间中)没有类型参数,因此暴露了类型object -您似乎正在声明/使用非泛型变体,但不使用System.Collections名称空间。

我认为修复特定编译错误的快速方法是将以下内容放在源代码文件的顶部:

using System.Collections;

或者,您可以通过在声明IEnumerable时指定类型参数来替代通用版本(您应该尽可能这样做,因为它是类型安全的),如下所示:

 IEnumerable<Car>
 IEnumerator<Car>

您可能还想阅读c#泛型入门

您似乎也有比这更多的错误,但这些似乎可能是来自复制和粘贴源的问题(特别是Garage不实现IEnumerable,无论是通用版本还是非通用版本,GetEnumerator是在Program类,而不是Garage类)。

你有更多的错误。但是对于这个错误,您在foreach中循环Garage,但是该类没有公开枚举器,主要是因为方法GetEnumerator实际上在类之外。将该方法移动到Garage中,然后你就可以一直到下一次崩溃的场景。

实际上,对于该错误,您需要using System.Collections;,然后您需要移动GetEnumerator方法。就像我说的,你在这段代码中有大量的错误

你有很多错别字。正如其他人所说,您的具体答案是您需要在类Garage语句中添加":IEnumerable"。

下面的代码修复得足够清晰:

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