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
in
ref
out
. - 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ılamazin
ref
. - 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
this
eriş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
veyayield break
)- ,
ref
veyaout
parametresi olan birin
yöntemi çağırma ref
yerel değişkenlerbreak
,goto
vecontinue
deyimlerithis
bir tür olduğundathis
struct
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
Action
dönen birvoid
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) => { };