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) { ... }
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. –
Jon, je ne veux pas le limiter à GUID, string, int mais juste mentionné ces types comme un exemple. BTW, grand fan de votre blog –
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. –