2010-10-25 112 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

相關問題