Diğerleri zaten kastetmiş olabileceğiniz sonsuz sayıda olası delege türü olduğunu belirtmişlerdir ; bu kadar özel Func
olan şey, Predicate
ya Action
da başka bir olasılık yerine varsayılan olmayı hak ediyor mu? Ve lambdalar için niyetin ifade ağacı formundan ziyade delege formunu seçmek olduğu açıktır?
Ama bunun Func
özel olduğunu söyleyebiliriz ve bir lambda veya anonim yöntemin çıkarılan türü bir şeyin Func'udur. Hala her türlü sorunumuz var. Aşağıdaki durumlar için ne tür çıkarımlar yapmak istersiniz?
var x1 = (ref int y)=>123;
Func<T>
Ref hiçbir şey alan bir türü yoktur .
var x2 = y=>123;
Resmi parametrenin türünü bilmiyoruz, ancak dönüşü biliyoruz. (Yoksa biz mi? Dönüş int? Uzun? Kısa? Byte?)
var x3 = (int y)=>null;
Dönüş türünü bilmiyoruz, ancak geçersiz olamaz. Dönüş türü, herhangi bir referans türü veya boş değerli bir değer türü olabilir.
var x4 = (int y)=>{ throw new Exception(); }
Yine, dönüş tipini bilmiyoruz ve bu sefer geçersiz olabilir .
var x5 = (int y)=> q += y;
Bu geçersiz dönen bir lambda mı yoksa q'ya atanan değeri döndüren bir şey mi? Her ikisi de yasal; hangisini seçmeliyiz?
Şimdi, bu özelliklerin hiçbirini desteklemediğinizi söyleyebilirsiniz. Sadece türlerin çalışılabileceği "normal" vakaları destekleyin. Bu yardımcı olmuyor. Bu hayatımı nasıl kolaylaştırıyor? Özellik bazen çalışıyor ve bazen başarısız olursa o zaman hala tüm bu hata durumlarını tespit etmek ve her biri için anlamlı bir hata mesajı vermek için kod yazmak zorunda . Hala tüm bu davranışları belirtmemiz, belgelememiz, testler yazmamız vb. Bu bir kullanıcıyı belki yarım düzine tuşa basarak kurtaran çok pahalı bir özelliktir . Dile değer katmanın daha iyi yolları var, yarım çalışmayan ve çalıştığı durumlarda neredeyse hiç fayda sağlamayan bir özellik için test senaryoları yazmak için çok zaman harcamak.
Aslında yararlı olduğu durum:
var xAnon = (int y)=>new { Y = y };
çünkü o şey için "konuşulabilir" tip yoktur. Ancak her zaman bu problemimiz var ve sadece türü çıkarmak için yöntem türü çıkarımını kullanıyoruz:
Func<A, R> WorkItOut<A, R>(Func<A, R> f) { return f; }
...
var xAnon = WorkItOut((int y)=>new { Y = y });
ve şimdi yöntem türü çıkarımı işlev türünün ne olduğunu ortaya çıkarır.
Func<>
en fazla 16 bağımsız değişken kabul edilir.