Neden yok C# derleyicisi bu iç içe ETMENİZ sorgu delirir?
Aşağıdaki kodu derlemek için deneyin ve derleyici ^ götüren bulabilirsiniz . 3 GB RAM (benim makinedeki tüm boş bellek) ve çok uzun zaman derlemek için (aslında 10 dakika sonra IO istisna olsun).
using System;
using System.Linq;
public class Test
{
public static void Main()
{
Enumerable.Range(0, 1).Sum(a =>
Enumerable.Range(0, 1).Sum(b =>
Enumerable.Range(0, 1).Sum(c =>
Enumerable.Range(0, 1).Sum(d =>
Enumerable.Range(0, 1).Sum(e =>
Enumerable.Range(0, 1).Sum(f =>
Enumerable.Range(0, 1).Count(g => true)))))));
}
}
Herkes bu tuhaf davranışlarını açıklayabilir mi?
CS Version: Microsoft (R) Visual C# Compiler version 4.0.30319.17929 OS Name: Microsoft Windows 7 Ultimate OS Version: 6.1.7601 Service Pack 1 Build 7601
CEVAP
Tür kesmesi ve/veya lambda nesil tür kesmesi normal ters yönde gitmesi gerektiğinde (), aşırı yükleme çözümü ile birlikte ilgili olduğuna inanıyorum. Ne yazık ki, sadece parametreleri, hiç yardımcı olmuyor bu türü besleyen bu muhtemelen hala tip kontrol etme yetkisine sahiptir.
Mantıklı Lambda incelendikten sonra sizinkine eşdeğer kodu olmalıdır, aşağıdaki kodu, sorun olmadan derler:
static void Main()
{
var x = Enumerable.Range(0, 1).Sum(a);
}
private static int a(int a)
{
return Enumerable.Range(0, 1).Sum(b);
}
private static int b(int b)
{
return Enumerable.Range(0, 1).Sum(c);
}
private static int c(int c)
{
return Enumerable.Range(0, 1).Sum(d);
}
private static int d(int d)
{
return Enumerable.Range(0, 1).Sum(e);
}
private static int e(int e)
{
return Enumerable.Range(0, 1).Sum(f);
}
private static int f(int f)
{
return Enumerable.Range(0, 1).Count(g);
}
private static bool g(int g)
{
return true;
}
Sanırım Eric Lippert yayınlanan önce bu tür kesmesi bir yerlerde C# derleyicisi (burada bazı sorunlar olabilir kuvvet derleyici için denemek çözmek bir NP-Tam problem olan sadece gerçek stratejisi (burada) kaba kuvvet. Eğer ilgili başvurular bulabilirsem onları da buraya ekleyeceğim.
En iyi referans bulabilirim. here Eric nerede tartışırken aslında bu aşırı çözüm işe neden gerçek maliyet unutma Enumerable.Sum 10 aşırı kabul lambda/yöntem.
Neden yok C# derleyicisi bu tercüme=! ...
Bir Sözlük geri dönmek için sorgu< E...
Varlık çerçevesi etmeniz() sorgu Vardı...
ETMENİZ neden bu kadar hızlı NEREYE ba...
Neden MYSQL yüksek LİMİTLİ sorgu aşağı...