2010-10-25 54 views
2

在章泛型CLR通过C#V3,杰弗里里希特说下面TypeList<T>有两个好处这里的编译时类型安全是什么意思?

  1. 编译时类型安全
  2. 拳击值类型

List<Object>,但如何编译时间型安全是否实现?

//A single instance of TypeList could hold different types. 
using System; 
using System.Collections.Generic; 
using System.Text; 
namespace MyNamespace 
{ 
    namespace Generics 
    { 
     class Node 
     { 
      private Node next_; 

      public Node(Node next) { 
       next_ = next;   
      } 

      public Node getNext() { 
       return next_; 
      } 
     } 
     internal sealed class TypeList<T> :Node 
     { 
      T data_; 
      public T getData() { 
       return data_; 
      } 

      public TypeList(T data, Node next):base(next) { 
       data_ = data; 
      } 

      public TypeList(T data):this(data,null) { 


      } 
      public override String ToString() 
      { 
       return data_.ToString() + (base.getNext() != null ? base.getNext().ToString() : string.Empty); 
      } 

      } 
     class Dummmy:Object 
     { 
      public override String ToString() { 
       return "Dummytype".ToString(); 

      } 

     } 

     class Program 
     { 
      static void Main(string[] args) 
      { 
       Dummmy dummy = new Dummmy(); 
       Node list = new TypeList<int>(12); 
       list = new TypeList<Double>(12.5121, list); 
       list = new TypeList<Dummmy>(dummy, list); 
       Double a = ((TypeList<Double>)list).getData();//Fails at runTime invalid cast exception 
       Console.WriteLine(list.ToString()); 
       Console.Write("sds"); 
      } 
     } 
    } 

} 
+0

好处是,泛型*不*值框类型,不是他们做的。 – Douglas 2010-10-25 08:40:06

+0

是的我明白这个部分,但是如何实现编译时间类型安全或作者认为编译时间类型安全 – yesraaj 2010-10-25 08:42:11

回答

5

编译类型安全意味着你会得到关于无效的类型使用所有的错误在编译时间,但不运行

例如下面的代码会导致编译时错误:

TypeList<int> list = new TypeList<int>(1); 
string someString = list.getData(); // compile error here 

如果你使用TypeList<object>就没有编译时的安全,因为编译器不会报告错误,你会得到运行时错误:

TypeList<object> list = new TypeList<object>(1); 
string someString = (string)list.getData(); // runtime error here 
+1

TypeList的单个实例可以拥有不同的类型。这就是TypeList 的原因,而不是一些可以容纳单一类型的时机。 – yesraaj 2010-10-25 08:55:45

+0

@yesraaj:TypeList 的Signle实例只能保存在编译时指定的类型T的值。 – 2010-10-25 09:06:02

+0

请查看我有问题的代码片段中主代码块中的示例代码。 – yesraaj 2010-10-25 09:12:08

1

这意味着,因为TypeList是一个泛型类,所以它在编译时是已知的,它是什么类型的使用,它可以避免您需要在运行时转换为实际使用的类型。

1

由于TypeList是通用的。 T的实际类型是在编译时定义的,因此任何对类型的检查都是在编译时完成的。

1
Double a = ((TypeList<Double>)list).getData(); //Fails at runTime 

这是你的问题的关键。 列表变量实际上是TypeList<Dummy>。编译器知道,并且在编写时会产生编译时错误

Double a = list.getData(); 

编译时类型安全性在那里工作。但是你申请了一个演员阵容让它编译。编译器根据他的假设开展工作:“他知道自己在做什么,他使用了演员”并让它通过。当然不会工作,现在它在运行时炸弹。

你可能会争论“但编译器知道演员不能工作,是不是什么类型的安全是关于?”。不,演员阵容非常强大,让你的覆盖编译器知道什么。这个特殊的例子不是很好的例子,但是你必须使用一个强制转换来将基类引用转换为派生类引用。很常见。演员的力量是危险的。泛型的一大优点是你不需要使用它们。

+0

list.getData()//编译器错误,因为列表没有getData方法 – yesraaj 2010-10-25 10:55:15

+0

@yesraaj - 您的TypeList <> * does *有一个getData()成员,不确定您的意思。 – 2010-10-25 11:00:42

+0

列表的类型为List和Not TypeList <>。 – yesraaj 2010-10-25 11:05:09

相关问题