Lambda ifadeleri ve anonim işlevler kullanılırken hatalar ve uyarılar

Lambda ifadelerini bildirme ve kullanmayla ilgili birkaç hata vardır:

  • CS0748: Tutarsız lambda parametre kullanımı; parametre türlerinin tümü açık veya tamamen örtük olmalıdır.
  • CS1621: Verim deyimi anonim bir yöntem veya lambda ifadesi içinde kullanılamaz.
  • CS1628: Anonim bir yöntem, lambda ifadesi veya sorgu ifadesi içinde veya parametresi kullanılamaz inrefout .
  • CS1632: Denetim anonim bir yöntemin veya lambda ifadesinin gövdesinden ayrılamaz.
  • CS1673: Yapıların içindeki anonim yöntemler, lambda ifadeleri ve sorgu ifadeleri 'this' öğesinin örnek üyelerine erişemez.
  • CS1686: Yerel değişken veya üyelerinin adresleri alınamaz ve anonim bir yöntem veya lambda ifadesi içinde kullanılamaz.
  • CS1706: İfade anonim yöntemler veya lambda ifadeleri içeremez.
  • CS8030: Geçersiz dönen temsilciye dönüştürülen anonim işlev bir değer döndüremez.
  • CS8175: Anonim bir yöntem, lambda ifadesi veya sorgu ifadesi içinde yerel başvuru kullanılamaz.
  • CS8916: Lambda ifadelerindeki öznitelikler parantez içinde parametre listesi gerektirir.
  • CS8971: InterpolatedStringHandlerArgument, lambda parametrelerine uygulandığında hiçbir etkiye sahip değildir ve çağrı sitesinde yoksayılır.
  • CS8975: Bağlamsal anahtar sözcük var açık lambda dönüş türü olarak kullanılamaz.
  • CS9098: Örtük olarak yazılan lambda parametresi '...' varsayılan değere sahip olamaz.

Buna ek olarak, lambda ifadelerini bildirme ve kullanmayla ilgili birkaç uyarı vardır:

  • CS8971: InterpolatedStringHandlerArgument, lambda parametrelerine uygulandığında hiçbir etkiye sahip değildir ve çağrı sitesinde yoksayılır.
  • CS9099: Varsayılan parametre değeri hedef temsilci türünde eşleşmiyor.
  • CS9100: Parametrenin lambda'da param değiştiricisi var ancak hedef temsilci türünde yok.

Lambda ifadelerinde söz dizimi sınırlamaları

Lambda ifadelerinde ve anonim yöntemlerde bazı C# söz dizimi yasaktır. Lambda ifadesinde geçersiz yapıların kullanılması aşağıdaki hatalara neden olur:

  • CS1621: deyimi yield anonim bir yöntem veya lambda ifadesi içinde kullanılamaz.
  • CS1628: Anonim bir yöntem, lambda ifadesi veya out sorgu ifadesi içinde , veya parametresi kullanılamazinref.
  • CS1632: Denetim anonim bir yöntemin veya lambda ifadesinin gövdesinden ayrılamaz.
  • CS1673: Yapıların içindeki anonim yöntemler, lambda ifadeleri ve sorgu ifadeleri örneği üyelerine thiserişemez.
  • CS1686: Yerel değişken veya üyelerinin adresleri alınamaz ve anonim bir yöntem veya lambda ifadesi içinde kullanılamaz.
  • CS8175: Anonim bir yöntem, lambda ifadesi veya sorgu ifadesi içinde yerel başvuru kullanılamaz.

Lambda ifadelerinde aşağıdaki tüm yapılara izin verilmez:

  • yield deyimleri (yield return veya yield break)
  • , refveya out parametresi olan bir inyöntemi çağırma
  • ref yerel değişkenler
  • break, gotove continue deyimleri
  • this bir tür olduğunda thisstruct erişim
  • Öznitelik oluşturucu gibi başka bir ifadenin içinde anonim yöntemler veya lambda ifadeleri.

Bu yapıların hiçbirini bir lambda ifadesinde veya anonim bir yöntemde kullanamazsınız. Yerel bir işlevde çoğuna izin verilir.

Ayrıca, bir lambda parametresine uygulandığında ilişkilendirilmiş dize işleyici türleri yoksayılır. Bir uyarı kullanırsanız aşağıdaki uyarıyı görürsünüz:

  • CS8971: InterpolatedStringHandlerArgument, lambda parametrelerine uygulandığında hiçbir etkiye sahip değildir ve çağrı sitesinde yoksayılır.

Lambda ifade parametreleri ve dönüşleri

Bu hatalar parametre bildirimiyle ilgili bir sorunu gösterir:

  • CS0748: Tutarsız lambda parametre kullanımı; parametre türlerinin tümü açık veya tamamen örtük olmalıdır.
  • CS9098: Örtük olarak yazılan lambda parametresi '...' varsayılan değere sahip olamaz.
  • CS8030: Geçersiz dönen temsilciye dönüştürülen anonim işlev bir değer döndüremez.
  • CS8916: Lambda ifadelerindeki öznitelikler parantez içinde parametre listesi gerektirir.
  • CS8975: 'var' bağlamsal anahtar sözcüğü açık lambda dönüş türü olarak kullanılamaz.

Lambda ifade parametreleri şu kurallara uymalıdır:

  • Lambda ifadesinde birden çok parametre olduğunda, tüm parametrelerin açıkça yazılması veya tüm parametrelerin örtük olarak yazılması gerekir.
  • Varsayılan değere sahip tüm lambda parametreleri açıkça yazılmalıdır.
  • Öznitelikler herhangi bir parametreye uygulanırsa, parametre listesi parantez içine alınmalıdır.

Lambda ifadesinin dönüş türleri şu kurallara uymalıdır:

  • Herhangi bir değer döndüren lambda ifadesi, gibi Actiondönen bir void temsilciye dönüştürülemez.
  • Dönüş türü çıkarılır veya açık bir türdür. anahtar sözcüğü var kullanılarak bildirilen bir dönüş türüne izin verilmez.

Lambda ifadesi temsilci türü

  • CS9099: Uyarı: Varsayılan parametre değeri hedef temsilci türünde eşleşmiyor.

Varsayılan bir değer bildirdiğinizde veya değiştiriciyi params lambda ifade parametresiyle eklediğinizde, temsilci türü veya Action türlerinden Func biri değildir. Bunun yerine, varsayılan parametre değerini veya params değiştiriciyi içeren özel bir tür. Aşağıdaki kod, bir türe varsayılan parametresi Action olan bir lambda ifadesi atadığından uyarılar oluşturur:

Action<int> a1 = (int i = 2) => { };
Action<string[]> a3 = (params string[] s) => { };

Hatayı düzeltmek için varsayılan parametreyi kaldırın veya temsilci türü için örtük olarak yazılan bir değişken kullanın:

Action<int> a1 = (int i) => { };
var a2 = (int i = 2) => { };
Action<string[]> a3 = (string[] s) => { };
var a4 = (params string[] s) => { };