2008-11-06 19 views
5

Yani garip durum: SonraC# 3.0 Func/OrderBy tür kesmesi

Func<SomeClass, int> orderByNumber = 
    currentClass => 
    currentClass.SomeNumber; 

:

someCollection.OrderBy(orderByNumber); 

Bu iyi, ama bunun yerine bir yöntem yaratmak için gidiyordu çünkü bir orderBy dışında başka bir yerde kullanılabilir.

private int ReturnNumber(SomeClass currentClass) 
{ 
    return currentClass.SomeNumber; 
} 

Şimdi OrderBy içine fiş çalıştığınızda: Bir Func eğer

someCollection.OrderBy(ReturnNumber); 

O can gibi türünü tahmin edilemez. Metodun kendisi, Func gibi "güçlü bir şekilde yazılan" yöntemden beri aynı olmalı.

Yan Not: Ben bunu yapabilirsiniz gerçekleştirmek:

Func<SomeClass, int> orderByNumber = ReturnNumber; 

cevap

8

Bu aynı zamanda "return-type type inference" not working on Method Groups ile ilgili olabilir.

Esas olarak, jenerik parametrelerin yalnızca giriş konumlarında olduğu durumlarda (Where 'yüklemi gibi), yöntem grubu dönüştürmesi düzgün çalışır. Ancak, jenerik parametrenin bir dönüş türü olduğu durumlarda (Select veya OrderBy projeksiyonları gibi), derleyici uygun delege dönüşümü sonucunu çıkarmaz.

8

ReturnNumber olmayan bir yöntem - yerine, bu adı ReturnNumber ile ama potansiyel olarak farklı Arity-ve-tipi imzalarla tüm yöntemleri ihtiva eden bir yöntem olup grubunu temsil eder. Bu yöntem grubunda hangi yöntemin gerçekten çok genel ve her zaman çalışır durumda olduğunu bulmakla ilgili bazı teknik sorunlar vardır. Açıkça, derleyici ,'un zamanın bir kısmını, hatta en fazla zamanını belirleyebiliyordu, ancak derleyiciye yalnızca yarım saat çalışacak bir algoritmanın yerleştirilmesinin kötü bir fikir olduğuna karar verildi. Ancak

aşağıdaki eserler:

someCollection.OrderBy(new Func<SomeClass, int>(ReturnNumber)) 
+0

Yöntem grubu ben düşünmüyordum şeydir. İki cevabı işaretleyebilirdim. –