2012-08-17 24 views
6

Attualmente funziona su un'associazione di ricerca bidirezionale generica, ordinata da TKey. Ad un certo punto spero di avere accesso come la seguente:Compilazione condizionale di metodi generici

public class Assoc<TKey, TValue> 
{ 
    public TKey this[TValue value] { get; } 
    public TValue this[TKey value] { get; } 
} 

Ma ovviamente quando TKey == TValue questo fallirà. Per curiosità, c'è una compilazione sintassi condizionale per fare questo:

public class Assoc<TKey, TValue> 
{ 
    [Condition(!(TKey is TValue))] 
    public TKey this[TValue value] { get; } 

    [Condition(!(TKey is TValue))] 
    public TValue this[TKey value] { get; } 

    public TKey Key(TValue value) { get; } 

    public TValue Value(TKey value) { get; } 
} 
+0

Quando si avrebbe utilizzando la classe con TKey == TValue essere utile? – casablanca

+0

Cosa significa 'pubblico TKey questo [valore TValue] {get; } 'fare? Non sto capendo lo scopo di questa API. –

+0

@casablanca, hai mai usato 'Dictionary '? Sembra che Jake voglia avere qualcosa di molto simile a un dizionario, ma con una ricerca associativa sia per chiave che per valore. –

risposta

4

No, non c'è compiltation condizionale basata sui tipi generici.

Le sostituzioni generiche vengono eseguite in fase di esecuzione, non in fase di compilazione.

Questa è una delle differenze tra generics .NET e modelli C++.

Anche i generici non hanno il concetto di specializzazione che i modelli C++ hanno.

http://msdn.microsoft.com/en-us/library/c6cyy67b.aspx

+2

+1. Nota "I generici sono risolti in fase di runtime, non in fase di compilazione." non è esattamente vero - i metodi in fase di compilazione in classe generica devono essere trovati correttamente (che è l'errore esatto che la classe di Jake produce quando il compilatore prova a scegliere quale versione di indicizzatore deve essere usata). –

+2

D'accordo con @Alexei; il problema qui non ha nulla a che fare con il comportamento di runtime dei generici. Questo è * puramente * una questione di risoluzione del sovraccarico del metodo, che è un costrutto in fase di compilazione. In particolare, il problema è che senza qualificatori (come 'dove TKey: Foo', ecc.) Questi sono entrambi trattati dal compilatore come' object' e quindi il normale comportamento del overload collision del metodo - quando due metodi condividono lo stesso tipi di parametri (es. 'object') - kick in. Questo è uno scenario temporale * compile *. –