SORU
3 HAZİRAN 2011, Cuma


Neden't C# anlaması görünüşte basit, bariz bu davadan yazın

Verilen bu kod:

class C
{
    C()
    {
        Test<string>(A); // fine
        Test((string a) => {}); // fine
        Test((Action<string>)A); // fine

        Test(A); // type arguments cannot be inferred from usage!
    }

    static void Test<T>(Action<T> a) { }

    void A(string _) { }
}

Derleyici Test(A) T string olmak çözemedim yakınıyor.

Bu benim için çok kolay bir dava gibi görünüyor, ve ben de yazdım diğer genel yarar ve uzantısı fonksiyonları çok daha karmaşık kesmesi dayanıyordu yemin ederim. Burada neyi kaçırıyorum?

Güncelleme 1: Bu# 4.0 C derleyicisi. VS2010 sorunu ve en basit durumda yeniden oluşturma Bir ben LİNQPad 4'te yapılan yukarıdaki örnek olduğunu keşfettim.

Güncelleme 2: ne işleri listesine biraz daha fazla örnek Eklendi.

CEVAP
3 HAZİRAN 2011, Cuma


Test(A);

Bu sadece uygulanan yöntem (Test<T>(Action<T>)) tür kesmesi gerekir çünkü başarısız olur ve algoritma türü kesmesi her argüman bir tür ya da anonim bir fonksiyonu olması gerekir. (Bu gerçektir değişkenden gelen belirtimi türü çıkarsama algoritması (madde 7.5.2)) yöntem grubu A değildir herhangi bir tür (olsa da olur convertable için uygun bir temsilci türü), ve değil bir anonim işlev.

Test<string>(A);

Bu, fark bağlamak ve Test etmek için gerekli değildir, ve Yöntem grubu gerekli Bir temsilci parametre türü void Action<string>(string) convertable ise başarılı olur.

Test((string a) => {});

Bu, fark algoritması kesmesi yazın ilk aşamada anonim işlevler (§7.5.2.1) karşılığı kılan olmayı başarıyor. Parametre ve dönüş türleri anonim işlevi vardır, bu yüzden açık bir parametre türü çıkarım yapılabilir, ve bir correspondense dolayısıyla yapılan arasında bu tür anonim fonksiyon (void ?(string)) ve türü parametre temsilci türü Test yöntemin parametre (void Action<T>(T)). Hiçbir algoritma anonim işlevler için bu algoritma uygun olacağını yöntem grupları belirtildi.

Test((Action<string>)A);

Bu başarılı, aradaki fark bu yazılmamış yöntem grup parametre A döküm bir tür, böylece sağlayan bu tür kesmesi Test normal olarak devam etmek için bir ifade ile belirli bir türü sadece Tartışma Yöntemi.

Aşırı çözümleme yöntem grubu A üzerinde çalıştı olamazdı neden teoride hiçbir neden düşünemiyorum. Sonra da—eğer—bulunduğu tek ve en iyi bağlama yöntemi, bir grup isimsiz bir işlev olarak aynı tedavi verilebilir. Bu yöntem, grup tam bir adayı içeren ve hiçbir tür parametreleri vardır bu gibi durumlarda özellikle doğrudur. Ama C#4'te çalışmıyor nedeni bu özellik tasarlanmış ve uygulanmış değildi aslında görünüyor. Alternatif çözüm kolay bu özellik karmaşıklığı, uygulama narowness ve üç varlığı göz önüne alındığında, nefesimi vermeyeceğim!

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Andrea Lewis

    Andrea Lewis

    14 Mart 2013
  • Lin Steven

    Lin Steven

    17 EKİM 2006
  • TokShogun

    TokShogun

    6 HAZİRAN 2009