2012-02-01 14 views
5

Sto tentando di creare la seguente firma nome della classe:vincolo di classe deve venire prima di qualsiasi altri vincoli

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

(sto usando struct per vincolare a enumerazioni)

sto errore

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

Capisco il messaggio, tuttavia, riorganizzando il codice non riesco a superare quello o qualche altro errore di sintassi. Come posso risolvere quella linea se non del tutto?

Se necessario, rimuoverò struct.

Grazie

+0

grazie a tutti per le diverse opzioni grazie a voi ragazzi che lo leggono in modi diversi. –

+1

Le cattive notizie viaggiano lentamente, non è possibile vincolare un argomento di tipo a System.Enum. La storia non era gentile con le enumerazioni, erano strutturalmente incompatibili avendo dimensioni diverse per il loro tipo di implementazione. Una ottimizzazione troppa nel linguaggio C, bloccata su C# a causa dell'interop. –

risposta

7

Intendevi class MyClass<T> : MyBase where T : struct?

+1

Grazie. Quando ho provato qualcosa di simile a questo, stavo aggiungendo una virgola ','. "La luce è verde, la trappola è pulita." –

1

si sta definendo <T> come due tipi diversi. struct è un tipo di valore dove MyBase è una classe che si riferisce a un tipo di riferimento. Non è qualcosa che è intercambiabile.

In questo caso sarebbe uno:

public class MyClass<T> where T : struct

o

public class MyClass<T> where T : MyBase

Here è così maggiori informazioni su farmaci generici e come usarli.

0

Se T deve essere un struct, non può ereditare da nessun altro tipo ... I tipi di valore non supportano l'ereditarietà.

16

I vincoli sono "ed-ed" insieme; all i vincoli devono essere soddisfatti.

In quali circostanze può essere sia T un non-nullable tipo di valore e anche la conversione implicita del MyBase classe tramite l'identità, la boxe o il riferimento di conversione?

Non ci sono tali circostanze, quindi non esiste alcun argomento di tipo che soddisfi i vincoli di T. Piuttosto che permettervi di definire una serie di vincoli che non possono essere soddisfatti, il compilatore semplicemente lo disattiva. Non è possibile affermare che è necessario il vincolo struct e un vincolo class type.

Sto usando struct per vincolare a enumerazioni

che illustra il mio punto. Dal momento che non ci sono enumerazioni che ereditano da MyBase, il vincolo non può essere rispettato.

Puoi descrivere per me cosa pensavi che significasse? Ad esempio, pensavi che significasse "qualsiasi tipo di valore non annullabile o qualsiasi tipo che è convertibile in MyBase"? Mi interessa sapere perché la gente crede cose false su C# in modo che io possa provare a migliorarlo.

AGGIORNAMENTO: Ah, vedo - MyBase è destinato ad essere la classe base di MyClass<T>, non la classe base di T. In C#, esso va:

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

Dovete mettere le classi base e le interfacce prima i vincoli, altrimenti il ​​compilatore pensa che essi siano i vincoli.

0

Non sicuro al 100% su questo, ma un rapido controllo di MSDN esce con questo where (generic type constraint) (C# Reference):

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

Non sono sicuro che è quello che stai cercando però.

+1

Questo sarebbe valido se ci fosse qualche indicazione che aveva bisogno di due distinti tipi paraterizzati, uno indipendente dall'altro, ma al momento non esiste tale indicazione. Sembra che abbia semplicemente desideri in competizione riguardo ai vincoli per un singolo parametro di tipo. –

+0

@AnthonyPegram - Questo è un punto valido, anche se ho letto la domanda in modo diverso. Non è del tutto chiaro (per me) quale OP sta cercando di realizzare, ed è per questo che ho messo l'avvertenza alla fine. – Tim

Problemi correlati