Metodo di estensione per IDictionary < t, k > : Gli argomenti del tipo per il metodo non possono essere dedotti dall'uso

StackOverflow https://stackoverflow.com/questions/1615687

  •  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!

È stato utile?

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");    
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top