2011-06-29 25 views
3

鑑於泛型類型定義亞型並不反映這樣

public class Generic<T> {} 
public class SubGeneric<T> : Generic<T> {} 

以下所有都是假的:

typeof(Generic<>).IsAssignableFrom(typeof(SubGeneric<>)); 
typeof(SubGeneric<>).IsSubclassOf(typeof(Generic<>)); 
typeof(SubGeneric<>).BaseType.Equals(typeof(Generic<>)); 

第一個有意義的(直到混凝土它們是不可轉讓)。但爲什麼這兩個行爲呢?

回答

2

SubGeneric<T>繼承Generic<T>,不Generic<>

有了它繼承Generic<>,它不會傳達足夠的信息。
考慮

class Wierd<T1, T2> : Generic<T1> { } 

class Wierd<T1, T2> : Generic<T2> { } 

甚至

class Wierd<T1, T2> : Generic<Wierd<T2, T1>> { } 

BaseType包括基礎類型的特定參數之間的差異。

typeof(SubGeneric<>).BaseType.GetGenericArguments()將返回一個包含SubGeneric<>的泛型類型參數(<T>)的數組。


typeof(SubGeneric<>).BaseType.GetGenericTypeDefinition() == typeof(Generic<>); 

應該是真實的。

+0

所以BaseType不等價很清楚,謝謝。但IsSubclass的錯誤仍然是錯誤的。鑑於兩個GTD的關係,爲什麼這不顯示兩者之間的繼承語義? –

+0

@Marc:看看我的例子。 'Wierd '不是'Generic <>'的子類;它是'Generic '的一個子類。 – SLaks

0

我認爲這是與通用參數。

SubGeneric<string>不是Generic<int>

所以在不知道泛型參數的子類,推理無法進行。

typeof(SubGeneric<int>).IsSubclassOf(typeof(Generic<int>)); 
typeof(SubGeneric<string>).BaseType.Equals(typeof(Generic<string>)); 

應該返回true

1

我認爲這些斷言是沒有意義的,直到T給出。

SubGeneric<T>Generic<T>SubGeneric<>Generic<>子類(沒有任何T)不是類在所有,並且不能獲得一個從彼此,或者可以意味着任何SubGeneric<U>可能是Generic<V>一個亞類中,這顯然是不正確。