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">
最后一个是我正在查找的错误。我做错了什么?
您可以使用Tester.Bear
、Tester.Camel
和Tester.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