2014-10-19 2 views
2

я следующий кусок расширения служит какой-то благой целью:Множественных где ограничений для одного общего типа

public static TV Put<TK, TV, TC>(this IDictionary<TK, TC> dictionary, TK key, TV value) where TC : ICollection<TV>, new() 
{ 
    TC collection = dictionary.TryGetValue(key); 

    if (collection == null) 
    { 
     dictionary.Add(key, collection = new TC()); 
    } 

    collection.Add(value); 

    return value; 
} 

// Omit the following code, it is used within method Put 
public static TV TryGetValue<TK, TV>(this IDictionary<TK, TV> dictionary, TK key) 
{ 
    TV result; 

    if (dictionary.TryGetValue(key, out result)) 
    { 
     return result; 
    } 

    return default(TV); 
} 

Я хочу дополнительно ограничение универсального параметра TC быть эталонным значения, так что пользователь не работает в проблемы во время выполнения if (collection == null) заявления в случае, если ТС является тип значения, так как я имею дело с такого рода проблемой, когда я хочу, чтобы коллекция быть как получена из

TC : ICollection<TV> и TC : class

ответ

4

Вы можете попробовать это:

public static TV Put<TK, TV, TC>(this IDictionary<TK, TC> dictionary, TK key, TV value) 
    where TC : class, ICollection<TV>, new() 
{ 
    ... 
} 

Кроме того, для типов как (значения и ссылки) можно заменить условие if (collection == null) с этим:

if (collection == default(TC)) 
+0

Он работал, спасибо! – Lu4

Смежные вопросы