SORU
6 NİSAN 2014, Pazar


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

Memory Usage

CEVAP
7 NİSAN 2014, PAZARTESİ


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.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • CommonArtisan

    CommonArtisa

    7 Temmuz 2012
  • Joseph Herscher

    Joseph Hersc

    14 Mart 2007
  • Watcher3223

    Watcher3223

    15 Kasım 2007