SORU
1 Temmuz 2011, Cuma


C değişkenleri ve genel tür çıkarsama# 4.0 adlı

Ben en başından beri programlama varsayımı altında, çağırırken bir yöntem C# 4.0, tedarik adları için argümanlar olmaz etkilediği sonucuna sürece, ne sen "atlama" bir veya daha fazla isteğe bağlı parametreler.

Biraz aşağıdaki davranış keşfetmek için sürpriz oldu:

Func<T>, yürütür bir alan bir yöntem vermiş ve sonucu verir:

public static T F<T>(Func<T> f)
{
    return f();
}

Ve yukarıdaki yöntemi görünür başka bir yöntem:

static void Main()
{
    string s;

F adlandırılmış bağımsız değişkenleri olmadan () çağıran herhangi bir sorun olmadan derler:

    s = F<string>(() => "hello world"); // with explicit type argument <string>
    s = F(() => "hello world"); // with type inference

Ve adlandırılmış bağımsız değişken kullanırken...

    s = F<string>(f: () => "hello world");

... yukarıdaki kod satırını açık tür argümanı kullanarak hala bir sorun olmadan derler. Ve belki de şaşırtıcı bir şekilde, eğer o önerecektir ReSharper yüklü ise "bağımsız değişken Türü belirtimi gereksiz".

Tür bağımsız değişkeni çıkarırken ancak,...

    s = F(f: () => "hello world");

C# derleyicisi bu hata raporu:

Yöntem tür bağımsız değişkenleri 'Programı.F(Sistemi.İşlev)' kullanımı. olayla olmak Açıkça tür bağımsız değişkenleri belirtmeyi deneyin.

Adlandırılmış bağımsız değişkenleri ve tür kesmesi arasındaki bu etkileşim mantıklı bir açıklaması var mı?

Bu davranış, bir yerde dil belirtimi belgelenmiştir?

Beni değişken adı için gerekli olduğunu anlıyorum. Ancak, bu anlamda iç dökümantasyon için benim yöntem çağrısında bağımsız değişken adı diye düşündüm burada çok daha karmaşık bir senaryoda bu davranış keşfettim. Nasıl bu sorunu gidermek için soruyorum. Dil ince noktalarını anlamaya çalışıyorum.

Şeyler daha ilginç hale getirmek için aşağıdaki tüm sorunları olmadan derler keşfettim

    Func<string> func = () => "hello world";
    s = F<string>(func);
    s = F(func);
    s = F<string>(f: func);
    s = F(f: func);
}

Bu arada statik olmayan yöntemler ile aynı davranışı gözlemledim. Ben sadece statik yöntemler örnek burada biraz daha kısa yapmak için kullanmayı seçti.

CEVAP
4 Temmuz 2011, PAZARTESİ


Çıkarım derleme çok iç içe düzeyde çalışacak bir şey değildir. Biraz tahmin değişkenleri sağlanan dayanmaktadır. Derleyici yazarları mantık çıkarım ile birlikte adlandırılmış parametre dikkate almadı hissediyorum. Mantık aynı olsa da soyut sözdizimi ağacı düşünün, ama her ikisi de varsa (()=>"") Xyz F Ve (F: ()=>"") xyz F Farklı soyut sözdizimi ağaçlar derleyici bakış açısıyla.

Sadece bir kural bile derleyici kuralları büyük bir set ile bir programın kendisi nerede derleyici tasarımcı tarafından kaçırılmış olduğunu hissediyorum. Bir kurala ilk uyan ama hiçbir kural ikincisi eşleşir. Kavramsal olarak doğru olabilir ama derleyici bir programdır ve tüm kuralları insan kodlanmıştır.

Tamam, Diğerleri kararlı gibi sanırım, Microsoft'a bir hata ve rapor edilmelidir !!

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Android Authority

    Android Auth

    3 NİSAN 2011
  • fufko

    fufko

    27 ŞUBAT 2006
  • Warner Bros. UK

    Warner Bros.

    6 HAZİRAN 2008