2012-02-01 182 views
5

我試圖創建下面的類名的簽名:類約束必須出現在任何其他約束

public class MyClass<T> where T : struct, MyBase 

(我使用結構約束,以枚舉)

我收到錯誤

The class type constraint 'MyBase' must come before any other constraints 

我知道這條消息,但是,重新排列代碼我無法越過那個或其他語法錯誤。如果可以的話,我該如何修復這條線?

如果必須,我會刪除struct

謝謝

+0

謝謝大家,因爲你們用不同的方式閱讀你的不同選擇。 – 2012-02-01 00:27:24

+1

壞消息傳播緩慢,你不能限制System.Enum的類型參數。歷史對枚舉並不友好,它們的實現類型具有不同的大小,從而在結構上不兼容。 C語言中的一個優化太多了,因爲互操作而被C#困住了。 – 2012-02-01 00:58:04

回答

7

您的意思是class MyClass<T> : MyBase where T : struct

+1

謝謝。當我嘗試類似這樣的事情時,我加了一個逗號','。 「光線是綠色的,陷阱很乾淨。」 – 2012-02-01 00:24:48

1

你定義<T>作爲兩個不同的類型。 struct是一個值類型,其中MyBase是引用引用類型的類。 這不是可以互換的東西。

在這種情況下,這將是兩種:

public class MyClass<T> where T : struct

public class MyClass<T> where T : MyBase

Here是關於泛型和如何使用他們,所以更多的信息。

0

如果T必須是struct,它不能從任何其他類型繼承...值類型不支持繼承。

16

約束條件被「編輯」在一起; 全部必須滿足約束條件。

在什麼情況下可以T爲既非空值類型並且還是經由身份,拳擊或引用轉換隱式轉換爲類MyBase?

沒有這樣的情況,所以沒有可能的類型參數滿足T的約束條件。編譯器不會讓你定義一組無法滿足的約束條件,而是簡單地禁止它。您不能說您需要約束structclass type約束。

我使用結構約束,以枚舉

,說明我的觀點。由於沒有從MyBase繼承的枚舉,所以不可能滿足約束條件。

你能爲我描述一下你的想法嗎?例如,您是否認爲這意味着「任何不可空值類型任何可轉換爲MyBase的類型」?我有興趣瞭解爲什麼人們相信C#的虛假事情,以便我可以嘗試改進它。

更新:啊,我看到 - MyBase旨在成爲基類MyClass<T>,而不是基類T。在C#中,有云:

class [class name] < [generic type parameters] > 
    : [base classes and interfaces] 
    where [type parameter] : [constraints] 

你必須把基礎類和接口之前的約束,否則編譯器認爲他們的約束。

0

不是100%肯定這一點,但MSDN的快速檢查出現這種where (generic type constraint) (C# Reference)

public class MyClass<T, U> where T : MyBase where U : struct 

不知道這是你在找什麼,但。

+1

如果有任何跡象表明他需要兩種截然不同的對象化類型,一種是彼此獨立的,但目前沒有這種跡象,這將是有效的。看起來好像他僅僅對單個類型參數的約束具有競爭慾望。 – 2012-02-01 00:21:10

+0

@AnthonyPegram - 這是一個有效的點,但我讀了不同的問題。對我而言,OP的設計目標並不完全清楚,這就是爲什麼我要提出警告的原因。 – Tim 2012-02-01 00:22:58