Metodo di estensione per IDictionary < t, k > : Gli argomenti del tipo per il metodo non possono essere dedotti dall'uso
-
06-07-2019 - |
Domanda
Nel tentativo di ripulire un sacco di codice ripetuto, ho provato a implementare il metodo di estensione di seguito:
public static void AddIfNotPresent(this IDictionary<TKey, TValue> dictionary, TKey key, TValue value)
{
if (!dictionary.ContainsKey(key))
{
dictionary.Add(key, value);
}
}
public static void Test()
{
IDictionary<string, string> test = new Dictionary<string, string>();
test.AddIfNotPresent("hi", "mom");
}
Si verifica un errore del compilatore durante la chiamata del metodo di estensione di:
L'argomento tipo per il metodo 'Util.Test.AddIfNotPresent (questo dizionario System.Collections.Generic.IDictionary, chiave TKey, valore TValue)' non può essere dedotto dall'uso. Prova a specificare esplicitamente gli argomenti del tipo.
Qualsiasi luce su questo argomento sarebbe molto apprezzata!
Soluzione
Il tuo metodo di estensione non è generico, ma dovrebbe esserlo, poiché i metodi di estensione devono essere definiti in classi di livello superiore non generiche. Ecco lo stesso codice dopo averlo reso un metodo generico:
// Note the type parameters after the method name
public static void AddIfNotPresent<TKey, TValue>
(this IDictionary<TKey, TValue> dictionary, TKey key, TValue value)
{
if (!dictionary.ContainsKey(key))
{
dictionary.Add(key, value);
}
}
Tuttavia, il tentativo di compilare il codice effettivamente pubblicato genera un messaggio di errore diverso da quello specificato. Ciò suggerisce che non hai pubblicato il codice reale ... e quindi quanto sopra potrebbe non risolvere comunque le cose. Tuttavia, il codice che hai pubblicato con la modifica precedente funziona correttamente.
Altri suggerimenti
Non è possibile farlo semplicemente con questo?
dictionary[key] = value;
Aggiunge la coppia chiave / valore se la chiave non esiste, o aggiorna il valore se esiste. Vedi Dictionary < TKey, TValue > .Item
.
Prova questo:
public static void AddIfNotPresent<TKey, TValue>
(this IDictionary<TKey, TValue> dictionary, TKey key, TValue value)
{
if (!dictionary.ContainsKey(key)) dictionary.Add(key, value);
}
public static void Test()
{
IDictionary<string, string> test = new Dictionary<string, string>();
test.AddIfNotPresent("hi", "mom");
}