2011-03-09 25 views
10

Bu temel tanımlara sahip olanBasit Linq ifadesi derlenmez

bool MyFunc(string input) 
{ 
    return false; 
} 
var strings = new[] {"aaa", "123"}; 

Bunun neden derlenmeyeceğini merak ediyorum:

var b = strings.Select(MyFunc); 

Fakat bu olacaktır:

var c = strings.Select(elem => MyFunc(elem)); 

Hata iletisi "Tür argümanlar 'System.Linq.Enumerable.Select (System.Collections.Generic.IEnumerable, System.Func)' yöntemi için kullanımdan çıkarılamaz.

Yeniden Paylaşılan hata ipucu,

Select(this IEnumerable<string>, Func<string, TResult>) 

ve

Select(this IEnumerable<string>, Func<string, int, TResult>) 

arasında karıştırıldığını söylüyor ... ancak MyFunc imzası açık - sadece bir (string) parametresi alıyor.

Burada biraz ışık tutabilir mi?

cevap

14

Genel tür kesmesi biraz değiştirildi - uygulama açısından - C# 3 ve C 4. derleyici arasındadır. İşte kısa ama tam bir örnek program var:

.NET 4 C# derleyicisi ile derler
using System; 
using System.Linq; 

class Test 
{ 
    static void Main() 
    { 
     string[] strings = { "a", "b" }; 
     var results = strings.Select(MyFunc); 
    } 

    static bool MyFunc(string input) 
    { 
     return true; 
    } 
} 

, ancak .NET 3.5 bir.

Ben bir Spec değişiklik oldu olmaz mı gibi bir hata düzeltme bu çağırmak için makul düşünüyorum .

var results = strings.Select((Func<string,bool>) MyFunc); 

veya

var results = strings.Select(new Func<string,bool>(MyFunc)); 

veya açık tip argüman yapabilir: .NET 3.5 den derleyici kullanmak zorunda ise

, sen netleştirmek için döküm ekleyebilir

var results = strings.Select<string, bool>(MyFunc); 
+0

yüzden * mantıksız * değildi şeyleri anlardı ... –

+0

@Cristi: Nope ...tam olarak nasıl çalışması gerektiğini speklerden ayırt etmeye çalışmak zor olsa da. Bence "Burada ejderhalar olmak" yazan türün çıkarım türünü düşünüyorum. –

+0

Değişiklik C# 3'e geçmek için çok geç olduğunda bu davranışı değiştirmeye karar verdik, bu yüzden C# 4 yerine koyduk. –

6

Jon elbette her zamanki gibi doğrudur. Bazı ek bilgiler: Burada

Ben yaşadığınız sorunu tarif 2007 blog makale:

bunu düzeltmeliyiz karar makaleye geri bildirime dayanarak http://blogs.msdn.com/b/ericlippert/archive/2007/11/05/c-3-0-return-type-inference-does-not-work-on-member-groups.aspx

ama alamadım zamanlama nedenleri için C# 3 içine sabitleyin.

Birkaç ay sonra ben düzeltme C# 4 gitmek duyurdu değil C# 3 hizmet paketi içine: Benim derleyici düşünmek arasında

http://blogs.msdn.com/b/ericlippert/archive/2008/05/28/method-type-inference-changes-part-zero.aspx