Метод расширения для IDictionary <t, k>: аргументы типа для метода не могут быть выведены из использования - PullRequest
0 голосов
/ 24 октября 2009

В попытке очистить много повторяющегося кода я попытался реализовать метод расширения ниже:

    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");
    }

Приводит к ошибке компилятора при вызове метода расширения:

Аргументы типа для метода 'Util.Test.AddIfNotPresent (этот словарь System.Collections.Generic.IDictionary, ключ TKey, значение TValue) не могут быть выведены из использования. Попробуйте указать аргументы типа явно.

Любой свет на эту тему будет высоко ценится!

Ответы [ 3 ]

6 голосов
/ 24 октября 2009

Ваш метод расширения не является универсальным, но должен быть, так как методы расширения должны быть определены в неуниверсальных классах верхнего уровня. Вот тот же код после того, как я сделал его универсальным методом:

// 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);
    }
}

Однако попытка скомпилировать код, который вы действительно разместили, приводит к сообщению об ошибке, отличному от указанного вами. Это говорит о том, что вы не опубликовали реальный код ... и поэтому вышеизложенное может не исправить ситуацию в любом случае. Тем не менее, код, который вы разместили с вышеуказанным изменением, работает нормально.

5 голосов
/ 24 октября 2009

Разве это не может быть сделано просто с этим?

dictionary[key] = value;

Добавляет пару ключ / значение, если ключ не существует, или обновляет значение, если оно существует. См. Dictionary<TKey,TValue>.Item.

4 голосов
/ 24 октября 2009

Попробуйте это:

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");    
}
...