2008-11-12 5 views
0

Je param essaie de faire quelque chose comme çagénérique Dictionnaire comme méthode ref

public void GetData(ref Dictionary<T,V> dataDictionary) 
{ 


} 

Où T peut être GUID, chaîne ou int et V est l'utilisateur ou objet personnalisé de l'élément.

+0

Eh bien, vous ne pouvez pas restreindre T être seulement Guid, string ou int - mais autre que cela devrait fonctionner. Il serait utile si vous postez une question réelle. –

+0

Jon, je ne veux pas le limiter à GUID, string, int mais juste mentionné ces types comme un exemple. BTW, grand fan de votre blog –

+0

Heureux que vous aimez le blog :) Mais quelle est la question réelle ici? Je suis d'accord avec Robert - vous ne voulez certainement pas vraiment utiliser ref. –

Répondre

0

Est-ce que cela aide? Toute information supplémentaire serait utile.

public void GetData<T, V>(ref Dictionary<T, V> dataDictionary) { 
    if (typeof(T) == typeof(string) || typeof(T) == typeof(int) || typeof(T) == typeof(Guid)) { 
     ... 
    } else { 
     throw new ArgumentException(); 
    } 
} 
2

Pourquoi voulez-vous pouvoir changer la référence des appelants? Pourquoi n'est pas

public Dictionary<T,V> GetData<T,V>() 

assez bon?

Dans votre monde basé ref-:

public void GetData<T,V>(ref Dictionary<T,V> dictionary) 

EDIT: Non pas que je cautionne en aucune façon ce qui suit, mais ...

Si vous avez besoin de se soucier des différents types T peut être, vous pouvez créer des remplacements génériques de la même manière que vous pouvez créer une méthode de remplacement.

// client code 
Dictionary<int, object> x = null; 
GetData(ref x); 

Dictionary<string, Guid> y = null; 
GetData(ref y); 

générique: overrides

public void GetData<V>(ref Dictionary<int, V> dictionary) 
{ 
    dictionary = new Dictionary<int,V>(); // reassign reference. 
} 
public void GetData<V>(ref Dictionary<string, V> dictionary) { ... } 
public void GetData<V>(ref Dictionary<Guid, V> dictionary) { ... } 

Alors que sémantiquement même, les dérogations suivantes ne sont pas possibles avec des valeurs de retour en raison de l'ambiguïté.

public Dictionary<int, T> ReturnData<T>() { ... } 
public Dictionary<string, T> ReturnData<T>() { ... } 

erreur CS0111: Type « Testing » définit déjà un membre appelé « returnData » avec les mêmes types de paramètres

Vous pouvez contourner l'ambiguïté en passant l'objet et, mais C'est tout aussi horrible à regarder:

public Dictionary<int, T> ReturnData<T>(Dictionary<int, T> self) { ... } 
public Dictionary<string, T> ReturnData<T>(Dictionary<string, T> self) { ... } 
+0

maintenant que vous le mentionnez, cela peut être une mauvaise idée d'utiliser le mot clé ref. suppose que je ne devrais pas travailler sur le code de quelqu'un d'autre tard le soir –

0

Quel est l'objectif ici? Vous mentionnez que string/Guid etc étaient que des exemples, donc je ne pense pas que nous devons nous concentrer sur les ...

Si vous voulez simplement être en mesure de manipuler le contenu du dictionnaire, puis « fait » - déjà travaux. puisque Dictionary<,> est un type de référence, l'appelant verra déjà tous les changements que vous faites. Vous pouvez supprimer le ref aussi ...

public void GetData(Dictionary<T,V> dataDictionary) // or IDictionary<T,V> 
{ 
    T key = GetSomeKey(); 
    V value = dataDictionary[key]; // query 
    dataDictionary.Remove(key); // mutate 
} 
Questions connexes