Bu bir hata mı?
Evet.
Tebrikler, aşırı yük çözümünde bir hata buldunuz. Hata C # 4 ve 5'te çoğalır; anlamsal analizörün "Roslyn" versiyonunda yeniden üretilmez. C # 5 test ekibini bilgilendirdim ve umarım bunu son sürümden önce araştırıp çözebiliriz. (Her zaman olduğu gibi söz yok.)
Doğru bir analiz izler. Adaylar:
0: C(params string[]) in its normal form
1: C(params string[]) in its expanded form
2: C<string>(string)
3: C(string, object)
Aday sıfır açıkça uygulanamaz çünkü string
dönüştürülemez string[]
. Üç kalıyor.
Üçü arasında benzersiz bir en iyi yöntem belirlemeliyiz. Bunu kalan üç adayın ikili karşılaştırmalarını yaparak yapıyoruz. Böyle üç çift var. İhmal edilen isteğe bağlı parametreleri çıkardığımızda hepsinin aynı parametre listeleri var , bu da şartnamenin 7.5.3.2 bölümünde açıklanan gelişmiş eşitlik bozma turuna gitmemiz gerektiği anlamına geliyor.
Hangisi daha iyi, 1 mi 2 mi? İlgili eşitliği bozan şey, jenerik bir yöntemin her zaman jenerik olmayan bir yöntemden daha kötü olmasıdır. 2 1'den daha kötüdür. Yani 2 kazanan olamaz.
Hangisi daha iyi, 1 mi 3 mü? İlgili eşitliği bozan şey şudur: Yalnızca genişletilmiş biçiminde uygulanabilen bir yöntem, her zaman normal biçiminde uygulanabilen bir yöntemden daha kötüdür. Bu nedenle 1, 3'ten daha kötüdür. Yani 1 kazanan olamaz.
Hangisi daha iyi, 2 mi, 3 mü? İlgili eşitliği bozan şey, jenerik bir yöntemin her zaman jenerik olmayan bir yöntemden daha kötü olmasıdır. 2, 3'ten daha kötüdür. Yani 2 kazanan olamaz.
Birden fazla uygun aday arasından seçilmek için bir adayın (1) yenilmemiş olması, (2) en az bir diğer adayı geçmesi ve (3) ilk iki özelliğe sahip olan benzersiz aday olması gerekir. Üçüncü aday başka hiçbir aday tarafından mağlup edilmez ve en az bir diğer adayı yener; bu mülke sahip tek adaydır. Bu nedenle üçüncü aday benzersiz en iyi adaydır . Kazanmalı.
Tuhaf bir hata mesajı verdiğini doğru bir şekilde not ettiğiniz gibi, sadece C # 4 derleyicisi yanlış anlamıyor. Derleyicinin aşırı yük çözümleme analizini yanlış anlaması biraz şaşırtıcı. Hata mesajını yanlış anlaması tamamen şaşırtıcı değildir; "belirsiz yöntem" hatası buluşsal yöntemi, en iyi yöntem belirlenemezse, temelde aday kümeden herhangi iki yöntemi seçer. Aslında varsa, "gerçek" belirsizliği bulmakta pek iyi değil.
Neden böyle olduğu sorulabilir. "Kesinlikle belirsiz" olan iki yöntem bulmak oldukça zordur çünkü "daha iyi" ilişkisi geçişsizdir . Aday 1'in 2'den daha iyi, 2'nin 3'ten daha iyi ve 3'ün 1'den daha iyi olduğu durumlarla karşılaşmak mümkündür. Böyle durumlarda ikisini "belirsiz olanlar" olarak seçmekten daha iyisini yapamayız.
Roslyn için bu buluşsal yöntemi geliştirmek isterim, ancak bu düşük bir önceliktir.
(Okuyucu için alıştırma: "Açıklık ilişkisinin geçişsiz olduğu bir dizi n öğenin benzersiz en iyi üyesini belirlemek için doğrusal bir zaman algoritması tasarlayın", bu takım için röportaj yaptığım gün sorulan sorulardan biriydi. çok zor bir algoritma; bir şans verin.)
C # 'a isteğe bağlı argümanlar eklemeye bu kadar uzun süre devam etmemizin nedenlerinden biri, aşırı yük çözüm algoritmasına getirdiği karmaşık belirsiz durumların sayısıydı; görünüşe göre doğru anlamadık.
Takip etmek için bir Connect sorununa girmek isterseniz, çekinmeyin. Sadece dikkatimizi çekmek istiyorsanız, yapıldığını düşünün. Önümüzdeki yıl testlerle devam edeceğim.
Bunu dikkatime sunduğun için teşekkürler. Hata için özür dileriz.
'Overloaded.ComplexOverloadResolution(string)'
atıfta<string>(string)
yöntemle; Sanırım(string, object)
hiçbir nesne sağlanmayan yöntemi ifade ediyor .