2013-04-11 7 views
8

IDictionary<object, object>'u içeren garip bir nedenden ötürü bir birim test başarısızlığım vardı.Bu aşırı yük çözünürlüğü herhangi bir anlam ifade ediyor mu?

IDictionary<K,V> iki Remove yöntemine sahiptir. Biri K, diğeri KeyValuePair<K,V> alır. Bu iki sözlükleri düşünün:

IDictionary<string, object> d1 = new Dictionary<string, object>(); 
IDictionary<object, object> d2 = new Dictionary<object, object>(); 
d1.Add("1", 2); 
d2.Add("1", 2); 
Console.WriteLine(d1.Remove(new KeyValuePair<string, object>("1", 2))); 
Console.WriteLine(d2.Remove(new KeyValuePair<object, object>("1", 2))); 

çıktı, sonra FalseTrue olduğunu. KeyValuePair<object,object>, d2.Remove(KeyValuePair<object,object>) tarafından beklenen türden tam olarak neden, derleyici neden d2.Remove(object)'u çağırıyor?

(Otopsi not: Sorun olacağı için

public class DictionaryTests<DictT> where DictT : 
    IDictionary<object,object>, new() 

: sorumu sorulur senaryoda

, ben genel bir parametre üzerinden doğrudan ziyade IDictionary<object,object> kullanmıyordum IDictionary, ICollection üzerinde önceliğe sahiptir ICollection kısıtlamaları listesine dahil ederek "işleri dışarıda bırakmaya" karar verdim:

public class DictionaryTests<DictT> where DictT : 
    ICollection<KeyValuePair<object, object>>, IDictionary<object,object>, new() 

ama bu neden olmasın acaba ... derleyici'nın zihin değişmedi)

+4

IIRC, bu kaynaklanmaktadır 'bildiren tipte' bulunan bir eşleşmeye ve baz türüne ilerlemez. Daha önce benzer bir soru sordum. Bağlantıyı arıyorum. Düzenleme: Buradan başlıyorsunuz: http://stackoverflow.com/q/12242346/15541 (sorunuz bir kopyadır) – leppie

+0

Doh! Benim soru genel bir arayüz ile ilgili olduğundan bu% 100 kopya değil mi? * * 'kaçınılmaz kapanmayı bekliyor * – Qwertie

+0

Aynı şey her tür için de geçerli. – leppie

cevap

2

soruna bir çözüm sağlamak için (bkz açıklama da):.

Console.WriteLine( 
    ((ICollection<KeyValuePair<object, object>) d2). 
     Remove(new KeyValuePair<object, object>("1", 2))); 
+0

kablolu, bunun hakkında düşünmedim. – Tigran

+0

@Tigran: Evet, beni de şaşırttı (ve pek çok şey yapmaz!) – leppie

+0

Tasarım ve her şeyden ötürü, belki de hariç, derleyici uyarısını hak eden bir şey gibi görünüyor. C# tasarımcılarının bu kural ile çözmeyi planladıkları bir problem var mı diye merak ediyorum. – Qwertie

İlgili konular