Cuts 5.0中的Nutshell泛型

时间:2014-07-21 02:12:06

标签: c# generics

它试图向我展示仿制药如何协调确保类型安全的例子。这是一个例子:

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)
  无法找到类型或命名空间的动物
  无法找到Camel的类型或命名空间   不能隐含转换类型&#39; Tester.Stack&#39;到Tester.Stack&#39;

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

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

为了扩展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无法隐式转换类型   &#39; C.Fiddle.Tester.Stack&#39;至   &#39; C.Fiddle.Tester.Stack&#39; C:\用户\ pieter_2 \文档\ Visual   工作室   2013 \ Projects \ ConsoleApplication1 \ ConsoleApplication1 \ Program.cs 14 44 ConsoleApplication1