SORU
29 Aralık 2011, PERŞEMBE


Neden ekleme yöntemi eğer olmaz ise belirsiz bir çağrı ekleyin,'belirsizlik dahil olmak istiyorsunuz

Bu Dersim var

public class Overloaded
{
    public void ComplexOverloadResolution(params string[] something)
    {
        Console.WriteLine("Normal Winner");
    }

    public void ComplexOverloadResolution<M>(M something)
    {
        Console.WriteLine("Confused");
    }
}

Eğer ararsam bu gibi:

        var blah = new Overloaded();
        blah.ComplexOverloadResolution("Which wins?");

Normal Winner konsola yazılır.

Ama, eğer başka bir yöntemi ekleyin

    public void ComplexOverloadResolution(string something, object somethingElse = null)
    {
        Console.WriteLine("Added Later");
    }

Aşağıdaki hatayı alıyorum:

Çağrı aşağıdaki yöntemleri veya özellikleri arasındaki belirsiz: >'Overloaded.ComplexOverloadResolution(params string[])' ve 'Overloaded.ComplexOverloadResolution<string>(string)'

Bir yöntem ekleme Ara bir belirsizlik tanıtmak olabilir anlıyorum, ama zaten (params string[]) <string>(string) var iki yöntem arasında bir belirsizlik! İki yöntem belirsizlik dahil net de ilk bir kullanımı olduğu için yeni eklenen bir yöntemdir, ve ikinci bir jenerik.

Bu bir hata mı? Hangi kısmını spec bu durumda olması gerektiğini söylüyor?

CEVAP
29 Aralık 2011, PERŞEMBE


Bu bir hata mı?

Evet.

Tebrikler, aşırı çözümleme bir hata buldunuz. C# 4 ve 5; yaygın oluşmaz böcek "Roslyn" semantik analiz sürümü. # 5 C test ekibine haber verdim, umarım bu son sürümü daha önce araştırılmamış çözüme ulaşabiliriz. (Her zaman olduğu gibi, söz yok.)

Doğru bir analiz takip ediyor. 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 string string[] konvertibl olmadığı için açıkçası uygulanmaz. Üç tane kaldı.

Üç, benzersiz iyi bir yöntem belirlemeliyiz. Bu yüzden kalan üç aday ikili karşılaştırmalar yaparak yapıyoruz. Üç çift vardır. Hepsi varaynıparametre biz gelişmiş tiebreaking yuvarlak belirtimi, bölüm 7.5.3.2 açıklanan gitmek zorunda olduğumuz anlamına geliyor atlanmış isteğe bağlı parametreler, kapalı şerit bir kez listeler.

Daha iyi, 1 veya 2 olan? İlgili farkla da genel bir yöntem, her zaman genel olmayan bir yöntemi daha kötü olmasıdır. 2, 1'den daha kötü. 2 kazanan olamaz.

Daha iyi, 1 veya 3 hangisi? İlgili son noktayı koydu: bir yöntem genişletilmiş haliyle bir yöntem normal haliyle ilgili her zaman daha kötüdür sadece uygulanabilir. Bu nedenle 1 3 daha kötü. 1 kazanan olamaz.

Daha iyi, 2 ya da 3 olan? İlgili farkla da genel bir yöntem, her zaman genel olmayan bir yöntemi daha kötü olmasıdır. 2 3 daha kötü. 2 kazanan olamaz.

İçin seçilen bir dizi birden çok geçerli aday adayı olmalı (1) yenilmedi, (2) yendi en az bir diğer aday, ve (3) benzersiz aday olan ilk iki özellik. Üç aday başka aday tarafından dövülmüş, ve en az bir diğer aday yener; bu özelliği ile tek aday. Bu nedenle aday üçunique best candidate. Kazanması bekleniyor.

Sadece# 4 C derleyici tuhaf bir hata iletisi bildirdiği doğru not yanlış oluyor. Derleyici aşırı çözümleme analizi yanlış olduğunu şaşırtıcı biraz. Hata iletisi yanlış tamamen şaşırtıcı değildir; "hata sezgisel iyi bir yöntem belirlenemiyor. temelde aday kümesinden herhangi iki yöntem seçtikleri" belirsiz bir yöntem oluyor bu "Aslında bir tane varsa." belirsizlik, gerçek bulma konusunda pek iyi değil

Makul neden diye sorabilirsiniz. Bulmak oldukça zoriki"çünkü "" ilişkisi var . betterness "unambigously belirsiz yöntemler ^em>geçişsiz. Olası aday 1 2, 2 3, 3 1 Daha iyi daha iyi daha iyi olduğu durumlar için. Bu gibi durumlarda biz daha iyi ikisi seçmekten daha yap "belirsiz olanlar".

Roslyn için bu sezgisel geliştirmek istiyorum ama düşük bir önceliktir.

(Egzersiz okuyucu: "Vasiyetle bir doğrusal-zaman algoritma tanımlamak için benzersiz en iyi üye kümesi n eleman nerede betterness ilişki geçişsiz" bir soru sordu gün görüştüm bu takım. Çok zor bir algoritma değil; bir şans ver.)

Bir sebep neden geri itti ekleyerek isteğe bağlı bağımsız değişkenler için C# çok uzun zaman oldu sayısı belirsiz karmaşık durumlar tanıttı içine aşırı çözümleme algoritması; görünüşe göre etmedik doğruyu yap.

Eğer bir takip için sorun Bağlayın girmek isterseniz, çekinmeyin. Eğer sadece bizim dikkatine getirdi istiyorsanız, olmuş bil. Gelecek yıl test takip ederim.

Beni bilgilendirdiğiniz için teşekkür ederim. Hata için özür dilerim.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • HSmasteryoda .

    HSmasteryoda

    22 Ocak 2010
  • merumputdotcom

    merumputdotc

    24 ŞUBAT 2012
  • Pál Zoltán Illés

    Pál Zoltán

    30 NİSAN 2007