编译错误CS0305

时间:2011-05-01 03:32:36

标签: c#

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

    }

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:6)

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

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

System.Collections

或者,您可以通过在声明using System.Collections; 时指定类型参数来使用Generic版本(您应该尽可能尝试这样做,因为它是类型安全的),如下所示:

IEnumerable

您可能还想阅读An Introduction to C# Generics

您似乎还有一些错误,但这些似乎可能来自复制和粘贴源的问题(特别是 IEnumerable<Car> IEnumerator<Car> 未实现Garage,无论是通用还是非-generic版本,IEnumerable类位于GetEnumerator类,而不是Program类。

答案 1 :(得分:1)

你有更多的错误。但是专门针对该错误,您在Garage中循环foreach,但该类不公开枚举器,主要是因为方法GetEnumerator实际上在类之外。将方法移到Garage内,然后您将能够一直到达下一次崩溃的场景。

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

答案 2 :(得分:0)

你有很多错别字。正如其他人所说,您的具体答案是您需要在您的类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;
            }
        }

    }

}