2015-07-31 31 views
71

aşağıdaki aşırı bir yöntemi vardır: Bu yayın neden gereksiz?

string Call(string function, Dictionary<string, object> parameters, object body) 
string Call(string function, Dictionary<string, object> parameters, JObject body) 

Şimdi başka aşırı ekledi:

string Call(string function) 
{ 
    return Call(function, null, (JObject) null); 
} 

yüzden derleyici onu kullanmalıdır aşırı bilir hangi JObject bir döküm ekledi. Ancak Visual Studio, dökümün gereksiz olduğunu söyler. Ama neden çağrılarım yokken belirsiz değil?

+18

Derleyici için belirsiz olmasa bile, oradaki dökümanı saklayacağım, çünkü – Alex

+5

no'lu kodu okuyan kişi için belirsiz olabilir. Nedeni bu değil. Kullanmaya aşırı yükleyen derleyiciye söylüyorum. Ve tamamen farklı uygulamalara sahip olabileceğinden, hangi metot aşırı yükünün kullanıldığı _does_ maddesidir. null' null', ancak buradaki cast, aşırı yüklenmenin kullanılması gereken bir ipucudur. – fero

+1

@jean Korkarım yine yanlış. Döküm sadece gereksizdir, çünkü derleyici, "JObject" 'e aktarmasa bile "JObject" aşırı yüklenmesini kullanacaktır, çünkü parametrelerle eşleşen en spesifik aşırı yükü kullanır ve "null" bir şeyle eşleşebilir ve "JObject" _is_ 'object''den daha spesifiktir. Ayrıntılı bir açıklama için Jon Skeet'in cevabına bakınız. – fero

cevap

96

Ancak neden çağrılarım yokken belirsiz değil?

JObject parametre ile aşırı yük object parametresi ile aşırı "daha iyi" olduğu için

... null den JObject dönüşüm object için null dönüşüm "daha iyi" olduğu için. JObject den object bir kapalı dönüştürme ancak bunun tam tersi, çünkü orada

JObject, object daha spesifiktir.

ilk yöntem için son parametre daha sonra de aşırı diğerinden daha iyi olur, ve çağrı döküm olmadan belirsiz olacaktır (örneğin) yerine string olsaydı.

Tüm karmaşık ayrıntılar için C# 5 spesifikasyonunun 7.5.3 bölümüne bakın. Özellikle, bölüm 7.5.3.5 ("daha iyi dönüşüm hedefi") burada geçerlidir.

+8

Günümüzde olduğu gibi sınıfla bir cast gerekmiyor olsa bile, hemen hemen tüm * ek referans tipi aşırı yük eklenmesi çağrı kodu kırılacağından, 'null' işlevinin geçersiz kılınması çağrı kodunu çok kırılgan yapar. yayınlanmaz. Belirsiz hale gelebilecek ek referans tipi aşırı yüklerin gerçekçi bir olasılığının olduğu durumlarda, ya da belirli bir aşırı yükün "daha iyi" olduğu düşünülen durumlarda, "sıfırdan" herhangi bir atığın "gereksiz" olduğunu düşünmüyorum. Kurallar, ancak pratik anlamda daha iyi olduğu açık değildir. – supercat

+1

BTW, uzun süredir aşırı yüklenme olan dillerin, belirli bir aşırı yükün belirtilmesi için birtakım fayda araçlarından ya da başka bir yoldan faydalanabileceğini düşündüğümden çok uzun süredir, bunların kullanılabilir olması durumunda "tercih edilen" olarak kabul edilmesi gerektiğini düşünürken, diğerleri yalnızca "geri dönüşler" olarak düşünülmelidir "; Bir aşırı yüklenmenin "null" parametre türünü belirtebileceğini de yararlı olacağını düşündüm. Böyle şeyler yapan herhangi bir dil biliyor musunuz? – supercat

+0

@supercat: Hayır, korkarım ki değil. –