它试图向我展示仿制药如何协调确保类型安全的例子。这是一个例子:
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;
最后一个是我正在寻找的错误。我做错了什么?
答案 0 :(得分:4)
您可以使用Tester.Bear
,Tester.Camel
和Tester.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