SORU
11 ŞUBAT 2011, Cuma


Neden't isimsiz bir yöntem var atanabilir?

Aşağıdaki kodu var:

Func<string, bool> comparer = delegate(string value) {
    return value != "0";
};

Ancak, aşağıdaki derleme değil:

var comparer = delegate(string value) {
    return value != "0";
};

Neden derleyici anlamaya Func<string, bool> bir şey olabilir mi? Bir dize parametresi alır ve bir boolean döndürür. Bunun yerine, bana hata veriyor:

Bir anonim yöntem atamak örtük olarak yazılan yerel değişken.

Ben bir tane var sanırımeğer var sürümü derlenmişeğer aşağıdaki olsaydım tutarlılık eksikliği.

var comparer = delegate(string arg1, string arg2, string arg3, string arg4, string arg5) {
    return false;
};

Yukarıdaki İşlev<^ beri bir anlamı yok . sadece 4 bağımsız değişken (in izin verir .NET kullanıyorum ne 3.5,). Belki birisi bu sorunu açıklığa kavuşturmak. Teşekkürler.

CEVAP
11 ŞUBAT 2011, Cuma


Diğerleri zaten sonsuz birçok olası temsilci türü olduğunu belirtiyorlarolabilir; Predicate Action yerine varsayılan olmasını hak Func hakkında bu kadar özel olduğunu ya da başka bir ihtimal gelmemişti. Ve, Lambda, neden niyeti temsilci formu, ifade ağaç şeklinde yerine seçmektir o kadar belli oluyor mu?

Ama Func özel olduğunu ve lambda veya anonim bir yöntem olayla tür bir İşlevi olduğunu söyleyebiliriz. Yine de her türlü sorunu olurdu. Ne tür aşağıdaki durumlarda olayla olmak ister misin?

var x1 = (ref int y)=>123;

Ref bir şey alır Func<T> tip yok.

var x2 = y=>123;

Dönüş biliyoruz ama resmi parametre türü olduğunu bilmiyoruz. (Ya biz? Dönüş int? uzun? kısa mı? bayt?)

var x3 = (int y)=>null;

Dönüş türü bilmiyoruz, ama boşluk olamaz. Dönüş türü herhangi bir başvuru türü veya herhangi bir NULL değer türü olabilir.

var x4 = (int y)=>{ throw new Exception(); }

Yine, dönüş türü, ve bu sefer onu bilmiyoruzolabilirhükümsüz olacak.

var x5 = (int y)=> q  = y;

O void döndüren bir lambda ifadesi veya q atanan değer döndüren bir şey olması amaçlanmıştır? Hem hukuk; hangisini seçmeliyiz?

Şimdi, diyebilirsiniz ki, sadece bu özellikleri herhangi bir destek yok. Sadece destek "normal" tip çalışmış olabilir durumlar. Bu yardımcı olmuyor. Bu durum hayatımı nasıl kolaylaştırır mı? Bu özelliği bazen çalışıyor ve bazen başarısız olursa o zaman ben hala kod yazmak zorundaAlgılatüm bu durumlar arıza ve veranlamlı bir hata iletisiher biri için. Yine de, tüm bu davranışları belirtmek için, bu belge, testleri yazmak zorunda. Bu birçok pahalı bir özellikkullanıcı yarım düzine belki tuş vuruşlarını kaydeder. Biz daha iyi yolları değer katmanın dil harcama daha fazla zaman yazılı test çalışmaları için bir özelliği çalışmıyor yarım saat ve gelmez sağlamak neredeyse hiç yararı durumlarda yaptığı iş.

Aslında yararlı olduğu durum:

var xAnon = (int y)=>new { Y = y };

"" o şeyi yazın. ağza oturuyor yok çünkü Ama bu sorun her zaman var, ve biz sadece yöntem tür kesmesi türünü anlamak için kullanın:

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 kesmesi işlev türü ne işe yarar.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • apenney888

    apenney888

    27 EKİM 2010
  • Bennythecoder

    Bennythecode

    25 Mart 2008
  • pissengehen

    pissengehen

    26 EYLÜL 2006