2010-01-27 8 views
33

vorrei specificare un contratto per questa interfaccia generica, utilizzando contratti Codice:Contratti di codice: come posso fornire una classe di contratto per un'interfaccia generica?

interface IRandomWriteAccessible<T> 
{ 
    T this[uint index] { set; } 
    uint Length { get; } 
} 

La documentazione dice di usare l'attributo ContractClass quando si specifica un contratto per un'interfaccia. Tuttavia, il compilatore si lamenterà di questo:

[ContractClass(typeof(IRandomWriteAccessibleContract<T>))] 
//    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  <-- compiler error 
interface IRandomWriteAccessible<T> { … } 

[ContractClassFor(typeof(IRandomWriteAccessible<T>))] 
//    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^   <-- compiler error 
sealed class IRandomWriteAccessibleContract<T> : IRandomWriteAccessible<T> { … } 

Sembra che i parametri di tipo non possano essere utilizzati con gli attributi.

Come do Scrivo un contratto per la mia interfaccia generica? O questo non è possibile con i Contratti di Codice?

+2

non ho verificato questo, ma rimuovere il ' T' dal tuo uso degli attributi come segue: '[ContractClass (typeof (IRandomWriteAccessibleContract <>))]' –

+0

@ Steve Guidi: OMG, questa modifica rende il compilatore felice. Non ho ancora controllato se funziona effettivamente come previsto. Riferirò non appena ne saprò di più. Grazie mille. – stakx

+1

@ Steve Guidi: il tuo suggerimento funziona. Se la ripeti come risposta, sarei felice di contrassegnarla come risposta accettata. Grazie per l'aiuto! – stakx

risposta

45

come detto da altri commenti in questa domanda, è necessario rimuovere l'identificatore di tipo generico dal vostro uso attributo in quanto non può essere risolto in fase di compilazione:

[ContractClass(typeof(IRandomWriteAccessibleContract<>))] 
+5

Ho esaminato la specifica del linguaggio C# per curiosità: i capitoli rilevanti sono _14.5.11 (typeof operator) _ e _25.5 (generics: types costruiti) _, se qualcun altro è interessato. – stakx

+15

Inoltre, se la classe generica di cui si digita typeof() richiede più di un parametro, è necessario utilizzare le virgole; ad esempio, typeof (YourType <,>), dove YourType accetta due parametri di tipo. –

1

Buona domanda, ma è possibile vedere le ragioni tecniche alla base di questa limitazione, giusto?

Il motivo per cui non è possibile specificare ContractClass è perché Blah<T> non è una classe.

Se è possibile creare un'interfaccia per una classe concreta specificando un valore per T, anche se sono sicuro che non è ottimale.

+0

Beh, sì, suppongo che abbia senso (dal punto di vista del compilatore). Spero ancora che ci sia una qualche soluzione generica, perché non ho voglia di specificare lo stesso contratto per tutti i possibili tipi di 'T' ... – stakx

+0

Il suggerimento di @Steve Guidi funziona? –

+0

@ John: Sì, ha funzionato! – stakx

Problemi correlati