2016-10-25 25 views
1

想象一下,無論您何時創建通用類MyClass<T>,都會自動生成一個接口MyClass<>,其中包含所有不使用通用參數或返回值的方法和屬性MyClass<T>在可以容納泛型類的任意T類型的變量類型中是否存在任何基本缺陷?

這將使我無法從創建一次性接口的工作中解脫出來,只是爲了能夠處理不同的T類型的通用對象。這個想法有一個基本問題,那就是它不是語言的一部分,或者只是一個「沒有被優先考慮或被認爲是重要的」的情況?

當我說「接口」時,我並不是說它必須被分類爲「接口」。這只是解釋我的意思的簡單方法。一種抽象基類將是另一種思考它的方式。如果此功能存在,則不會將其視爲生成的接口,例如List<>類型的變量當然可以包含任何通用列表,例如List<int>List<MyElement>,然後您可以調用它,如CountClear(),Capacity等,因爲那些不需要知道類型的T

只是爲了說清楚爲什麼這不是一個討論話題,但有一個明確的答案的問題:

我的問題是,是否有在想法本身就是一個缺陷,使得它與類型安全不兼容或相似,還是其中沒有任何根本的缺陷。用法

例子:

我有一個既包含一些數據依賴於泛型類型,並沒有一些其他數據的通用類。而且我有可以重用的代碼,可以操縱數據的非通用部分。目前我只能通過定義與我的泛型類具有相同成員的接口(減去使用泛型參數或返回值的成員)來完成此操作。當我不打算實現多個實現時,必須定義這個接口似乎是多餘的。在沒有指定額外接口的情況下可以完成相同的語言功能,因爲所需的信息已經在泛型類本身中,對於這種情況將會很方便。

對於簡單的情況,通用類有一個非泛型基類。但是,如果MyClass<T>已從MyBaseClass<T>繼承,則不可能在其中放入非泛型類,並且只能使用一個接口。

+4

我已經讀了三次你的問題,我仍然完全不知道你在問什麼。 –

+0

我同意你在問什麼? –

+0

我在問,如果這樣一個特性在概念上可能會添加到C#中,或者如果這個想法存在根本的缺陷,這意味着這樣的語言特性永遠不會被添加到C#中。 – runevision

回答

2

我的問題是這個想法本身是否存在一個缺陷,使得它與類型安全或類似問題不相容,或者它是否沒有任何根本的缺陷。

不,考慮到您可以自己手動創建基類/接口,沒有理由說語言無法自動創建它。 (無論它應該是另一個問題完全。)

但是,如果你建立這樣的語言.Net的,你很可能不會把它MyClass<>,因爲那已經是用來表示開放式泛型類型(這使得typeof(MyClass<>)有效的表達式)。

+0

我想自然的後續問題是「爲什麼我們不能聲明一個開放泛型的變量?」 – Superpig

+0

@Superpig因爲沒有對象可以分配給這樣的變量。如果你問「爲什麼不能將一個封閉泛型類型的對象賦值給一個類型爲相應的開放泛型類型的變量?」,那麼我認爲這是一個相當不重要的特性,它具有可疑的用處。 – svick

+0

@svick這是我想到的功能。由於開放泛型類型目前在變量類型目的語言中未被使用,所以它不應該發生衝突,並且在我看來,如果一個封閉的泛型對象可以被分配給一個開放泛型類型的變量,那麼它就會很直觀。開放的泛型類型比對象的限制性更小,就像接口限制性更小一樣。當我第一次瞭解到開放泛型時,我認爲你可以做到這一點。 – runevision

相關問題