2012-08-17 13 views
6

Actualmente trabaja en una asociación de búsqueda bidireccional genérica, ordenada por TKey. En algún momento espero tener acceso como la siguiente:Compilación condicional de métodos genéricos

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

Pero obviamente cuando TKey == TValue esta fallará. Por curiosidad, ¿hay una sintaxis de compilación condicional para hacer esto:

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

Cuando se utiliza la clase con TKey == TValue ser útil? – casablanca

+0

¿Qué significa 'public TKey this [TValue value] {get; } '¿hacer? No estoy entendiendo el propósito de esta API. –

+0

@casablanca, ¿Alguna vez ha usado 'Dictionary '? Parece que Jake quiere tener algo muy similar a un diccionario, pero con búsqueda asociativa tanto por clave como por valor. –

Respuesta

4

No, no hay compiltation condicional basada en tipos genéricos.

Las sustituciones genéricas se realizan en tiempo de ejecución, no en tiempo de compilación.

Esta es una de las diferencias entre los genéricos de .NET y las plantillas de C++.

Los genéricos tampoco tienen el concepto de especialización que tienen las plantillas de C++.

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

+2

+1. Nota: "Los genéricos se resuelven en tiempo de ejecución, no en tiempo de compilación". no es exactamente cierto: en los métodos de compilación en tiempo de clase genérica deben encontrarse correctamente (que es un error exacto que la clase de Jake produce cuando el compilador intenta elegir qué versión del indizador debe usarse). –

+2

De acuerdo con @Alexei; el problema aquí no tiene nada que ver con el comportamiento en tiempo de ejecución de los genéricos. Esto es * puramente * una cuestión de resolución de sobrecarga de método, que es una construcción en tiempo de compilación. En particular, el problema es que sin calificadores (como 'where TKey: Foo', etc.) ambos son tratados por el compilador como' object' y por lo tanto el comportamiento de colisión de sobrecarga de método normal - cuando dos métodos comparten el mismo tipos de parámetros (es decir, 'objeto') - se inicia. Este es un escenario de tiempo * compilar *. –