Nutshell泛型中的C#5.0

本文关键字:C#5 泛型 Nutshell | 更新日期: 2023-09-27 18:14:01

它试图向我展示泛型如何不协变以确保类型安全的例子。以下是示例:

class Animal{}
class Bear : Animal {}
class Camel : Animal {}
public class Stack<T> /// a simple stack implementation
{
   int position;
   T[] Data = new T[100];
   public void Push (T obj) { data[position++] = obj;}
   public T Pop() { return data[--position] }
}
Stack<Bear> bears = new Stack<Bear>();
Stack<Animal> animals = bears;     ////COMPILE-TIME ERROR

这就是我们的意图。它还展示了animals.Push (new Camel());是如何不可能的,当我试图运行相同的代码来查看发生了什么时,我会得到一组不同的错误。我想这是因为我不知道如何实际运行代码。

namespace C.Fiddle
{
   class Program
   {
      static void Main(string[] args)
      {
         Tester.Stack<Bear> bears = new Tester.Stack<Bear>();
         Tester.Stack<Animal> animals = bears;
         animals.Push(new Camel());
      }
   }
}
public class Tester
{
   public class Stack<T>
   {
      int position;
      T[] data = new T[10];
      public void Push(T obj) { data[position++] = obj; }
      public T Pop() { return data[position--]; }
   }
   public class Animal { }
   public class Bear : Animal { }
   public class Camel : Animal { }

   public class ZooCleaner
   {
      private static void Wash<T> (Stack<Animal> animals) where T: Animal {}
   }
}

错误为:

找不到类型或命名空间Bear(x2(
找不到类型或命名空间Animal
找不到类型或命名空间Camel
无法将类型"Tester.Stack"隐式转换为"Tester.Stack">

最后一个是我正在查找的错误。我做错了什么?

Nutshell泛型中的C#5.0

您可以使用Tester.BearTester.CamelTester.Animal来访问这些类,因为它们嵌套在Tester类中。

要扩展John Koerner的观点,您的coe模块应该如下所示:

namespace C.Fiddle
{
    class Program
    {
        static void Main(string[] args)
        {
            Tester.Stack<Bear> bears = new Tester.Stack<Bear>();
            Tester.Stack<Animal> animals = bears;
            animals.Push(new Camel());
        }
    }
    class Animal { }
    class Bear : Animal { }
    class Camel : Animal { }
    public class Tester
    {
        public class Stack<T>
        {
            int position;
            T[] data = new T[10];
            public void Push(T obj) { data[position++] = obj; }
            public T Pop() { return data[position--]; }
        }
        public class ZooCleaner
        {
            private static void Wash<T>(Stack<Animal> animals) where T : Animal { }
        }
    }
}

你现在只有一个错误:

错误1无法隐式转换类型"C.Fiddle.Tester.Stack"'C.Fiddle.Tester.Stack'C:''users''pieter_2''documents''visual演播室2013''Projects''ConsoleApplication1''ConsoleApplication1''rogram.cs 14 44 ConsoleApplication1