Aracılığıyla paylaş


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

Lambda ifadelerinin ve anonim yöntemlerin bildirilmesi ve kullanılmasıyla ilgili çeşitli hatalar vardır:

  • CS0407: 'method' yanlış dönüş türüne sahip.
  • CS0428: 'Identifier' yöntem grubu temsilci olmayan 'type' türüne dönüştürülemiyor. Yöntemini çağırmayı amaçladınız mı?
  • CS0748: Tutarsız lambda parametre kullanımı; parametre türlerinin tümü açık veya tamamen örtük olmalıdır.
  • CS0815: Örtük olarak türü belirlenmiş bir değişkene 'ifade' atanamaz.
  • CS0828: Anonim tür özelliğine 'ifade' atanamıyor.
  • CS0837: 'is' veya 'as' işlecinin ilk işleneni lambda ifadesi, anonim yöntem veya yöntem grubu olmayabilir.
  • CS1065: Varsayılan değerler bu bağlamda geçerli değildir.
  • 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 inrefout parametresi kullanılamaz.
  • CS1632: Denetim anonim bir yöntemin veya lambda ifadesinin gövdesinden ayrılamaz.
  • CS1643: Tüm kod yolları anonim 'type' türünde bir değer döndürmez.
  • CS1660: Lambda ifadesi bir temsilci türü olmadığından 'type' türüne dönüştürülemiyor.
  • CS1661: Parametre türleri temsilci parametre türleriyle eşleşmediğinden anonim yöntem bloğu 'type' türüne dönüştürülemiyor.
  • CS1662: Bloktaki bazı dönüş türleri temsilci dönüş türüne örtük olarak dönüştürülemediğinden anonim yöntem bloğu hedeflenen temsilci türüne dönüştürülemiyor.
  • CS1673: Yapıların içindeki anonim yöntemler, lambda ifadeleri ve sorgu ifadeleri 'this' öğesinin örnek üyelerine erişemez.
  • CS1676: 'number' parametresi 'anahtar sözcük' anahtar sözcüğüyle bildirilmelidir.
  • CS1677: 'number' parametresi 'anahtar sözcük' anahtar sözcüğüyle bildirilmemelidir.
  • CS1678: 'number' parametresi 'type1' türü olarak bildirilir ancak 'type2' olmalıdır.
  • CS1686: Yerel değişken veya üyelerinin adresleri alınamaz ve anonim bir yöntem veya lambda ifadesi içinde kullanılamaz.
  • CS1688: Bir veya daha fazla out parametresi olduğundan, parametre listesi olmayan anonim yöntem bloğu 'delegate' temsilci türüne dönüştürülemiyor.
  • CS1706: İfade anonim yöntemler veya lambda ifadeleri içeremez.
  • CS1731: Bloktaki dönüş türlerinden bazıları temsilci dönüş türüne örtük olarak dönüştürülemediğinden ifade temsilciye dönüştürülemiyor.
  • CS1732: Beklenen parametre.
  • CS1764: Anonim bir yöntem, lambda ifadesi veya sorgu ifadesi içinde sabit yerel kullanılamaz.
  • 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.
  • CS8820: Statik anonim işlev 'değişken' başvurusu içeremez.
  • CS8821: Statik anonim işlev 'this' veya 'base' başvurusu içeremez.
  • CS8916: Lambda ifadelerindeki öznitelikler parantez içinde parametre listesi gerektirir.
  • CS8917: Temsilci türü çıkarılamadı.
  • CS8934: Dönüş türü temsilci dönüş türüyle eşleşmediğinden anonim yöntem 'type' türüne dönüştürülemiyor.
  • 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 kullanma ile ilgili birkaç uyarı vardır:

  • CS0467: 'method' yöntemi ile 'yöntem dışı' yöntemi arasındaki belirsizlik. Yöntem grubunu kullanma.
  • CS1911: Anonim bir yöntemden, lambda ifadesinden, sorgu ifadesinden veya yineleyiciden bir 'base' anahtar sözcüğü aracılığıyla üyeye erişim doğrulanamaz kodla sonuçlanabilir.
  • CS8971: InterpolatedStringHandlerArgument, lambda parametrelerine uygulandığında hiçbir etkiye sahip değildir ve çağrı sitesinde yoksayılır.
  • CS8974: 'method' yöntem grubu temsilci olmayan 'type' türüne dönüştürülüyor. Yöntemini çağırmayı amaçladınız mı?
  • 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.

Derleyici ayrıca aşağıdaki bilgilendirme iletisini de üretir:

  • CS9236: Derleme, lambda ifadesinin en az sayım sürelerini bağlamasını gerektirir. Lambda ifadesini açık parametre türleriyle bildirmeyi göz önünde bulundurun veya içeren yöntem çağrısı genelse, açık tür bağımsız değişkenlerini kullanmayı göz önünde bulundurun.

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

  • CS0837: is veya as işlecinin ilk işlemi lambda ifadesi, anonim yöntem veya yöntem grubu olamaz.
  • CS1621: deyimi yield 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.
  • 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'ün ö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.
  • CS1764: Anonim bir yöntem, lambda ifadesi veya sorgu ifadesi içinde sabit yerel kullanılamaz.
  • CS1911: Uyarı: Anonim bir yöntemden, lambda ifadesinden, sorgu ifadesinden veya yineleyiciden 'base' anahtar sözcüğü aracılığıyla üyeye erişim doğrulanamaz kodla sonuçlanabilir.
  • CS8175: Anonim bir yöntem, lambda ifadesi veya sorgu ifadesi içinde yerel başvuru kullanılamaz.
  • CS8820: Statik anonim işlev 'değişken' başvurusu içeremez.
  • CS8821: Statik anonim işlev 'this' veya 'base' başvurusu içeremez.
  • CS8971: Uyarı: InterpolatedStringHandlerArgument, lambda parametrelerine uygulandığında hiçbir etkiye sahip değildir ve çağrı sitesinde yoksayılır.
  • CS9236: Bilgilendirici: Derleme, lambda ifadesinin en az belirli bir sayıda kez bağlanmasını gerektirir. Bunu sağlamak için lambda ifadesini açık parametre türleriyle bildirmeyi göz önünde bulundurun veya içeren yöntem çağrısı genelse, açık tür bağımsız değişkenlerini kullanmayı göz önünde bulundurun.

Derleyici, lambda ifadeleri ve anonim yöntemler içinde belirli C# yapılarını yasaklar. Derleyici lambdaları ve anonim yöntemleri temsilci çağrılarına veya ifade ağaçlarına dönüştürdüğünden ve bazı yapılar bu formlarda temsil edilemediğinden bu kısıtlamalar vardır. Daha fazla bilgi için C# belirtiminin anonim işlev ifadeleri bölümüne bakın.

Aşağıdaki yönergeleri kullanarak bu hataları düzeltebilirsiniz:

  • Lambda gövdesinden herhangi bir yield return veya yield break deyimini, kapsayan yineleyici yönteme taşıyın veya lambda'yı yield deyimlerini destekleyen yerel bir işleve dönüştürün (CS1621).
  • Lambda gövdesi içindeki kapsayan yöntemden , inveya refparametrelerine başvurmaktanout kaçının. Lambda bu parametreleri kapatma işleminin bir parçası olarak yakaladığında, benzer parametrelerin refbaşvuru semantiği korunamaz. Değeri yerel bir değişkene kopyalayın ve bunun yerine bu yerel değişkeni kullanın veya lambda'yı yerel bir işleve (CS1628) dönüştürün.
  • Denetimi lambda gövdesinden dışarı aktaran tüm break, gotoveya continue deyimlerini kaldırın. Denetim akışı deyimleri aynı lambda gövdesindeki (CS1632) etiketleri veya döngüleri hedeflemelidir.
  • Bir struct türünde, lambda ifadesi, anonim yöntem veya sorgu ifadesi içinde this ile örnek üyelerine başvurmaktan kaçının. Derleyici bir this'yi struct içinde değer olarak yakaladığından, lambda ifadesi içindeki mutasyonlar özgün örneği etkilemez. Gerekli üye değerlerini lambdadan önce yerel değişkenlere ayıklayın veya doğrudan erişebilen this yerel bir işleve dönüştürün (CS1673).
  • Lambda'nın da yakaladığı yerel değişkenin adresini almayın. Derleyici, yakalanan değişkenleri yığınla ayrılmış bir kapatma nesnesine taşır ve adreslerini kararsız hale getirir. Adres alma mantığını lambdadan ayırın veya bunun yerine yerel bir işlev kullanın (CS1686).
  • Lambda ifadesini veya anonim yöntemi, bunu engelleyen içeren ifadenin dışına taşıyın. Öznitelik oluşturucuları gibi bazı ifadeler, bağımsız değişken olarak lambda ifadelerini veya anonim yöntemleri desteklemez (CS1706).
  • Lambda gövdesi içinde yerel değişken kullanmayın fixed . fixed deyiminin sabitleme garantisi, derleyicinin oluşturduğu kapanışa (CS1764) değil, yalnızca kapsayan alana uygulanır.
  • Lambda'nın içinde yerel bir değişkenref kullanmayın. Parametreler gibi ref yereller de ref derleyicinin lambda için oluşturduğu kapanışta yakalanamaz. Değeri yerel olmayanref bir değişkene atayın veya lambda'yı yerel bir işleve (CS8175) dönüştürün.
  • is veya as işlecinin ilk işleneni olarak lambda ifadesi, anonim yöntem veya yöntem grubu kullanmayın. Bu yapıların çalışma zamanında test edilebilecek bir türü yoktur. önce ifadeyi bir değişkene atayın, ardından değişkeni test edin (CS0837).
  • Değiştiriciyi static lambdadan kaldırın veya yakalanan değişkene başvuruyu kaldırın. Lambdastatic, yerel değişkenlerin, parametrelerin yakalanmasını veya this istenmeyen kapatma ayırmalarını önlemeyi açıkça yasaklar. Dış değişkenlere başvurmanız gerekiyorsa değiştiriciyi static kaldırın. Yığın ayırmayı en az düzeyde tutmak istiyorsanız, değerleri lambdaya parametre olarak geçirin (CS8820, CS8821).
  • InterpolatedStringHandlerArgumentAttribute öğesini lambda parametresinden kaldırın veya özniteliğin geçerli olduğu bir metoda taşıyın. Lambda çağrıları normal metot çağrılarıyla aynı interpolasyonlu dize işleyicisini kullanmadığından (CS8971), derleyici lambda parametrelerinde bu özniteliği yoksayar.
  • Lambda veya anonim yöntem içinde base anahtarını kullanarak sanal bir üyeyi çağırmaktan kaçının. Derleyici, doğrulanamayan kod üreten bir yardımcı yöntemi aracılığıyla sanal olmayan bir çağrı oluşturur. Çağrıyı ayrı bir yönteme ayıklamayı base ve bunun yerine lambda'dan bu yöntemi çağırmayı düşünün (CS1911).
  • Lambda ifadelerini kabul eden aşırı yüklenmiş yöntem çağrılarının karmaşıklığını azaltın veya açık tür bilgileri ekleyin. Derleyicinin aşırı yüklemeleri çözmek için bir lambda ifadesini birden çok kez bağlaması gerektiğinde, bu bilgilendirici tanıyı üretir. Lambda'yı açık parametre türleriyle bildirmek veya genel yöntem çağrısında açık tür bağımsız değişkenleri sağlamak, derleyicinin gerçekleştirmesi gereken bağlama geçişi sayısını azaltır (CS9236).

Lambda ifade parametreleri ve dönüşleri

  • CS0748: Tutarsız lambda parametre kullanımı; parametre türlerinin tümü açık veya tamamen örtük olmalıdır.
  • CS1065: Varsayılan değerler bu bağlamda geçerli değildir.
  • CS1643: Tüm kod yolları anonim 'type' türünde bir değer döndürmez.
  • CS1661: Parametre türleri temsilci parametre türleriyle eşleşmediğinden anonim yöntem bloğu 'type' türüne dönüştürülemiyor.
  • CS1662: Bloktaki bazı dönüş türlerinin temsilci dönüş türüne örtük olarak dönüştürülemediği için anonim yöntem bloğu hedeflenen temsilci türüne dönüştürülemiyor.
  • CS1676: 'number' parametresi 'anahtar sözcük' anahtar sözcüğüyle bildirilmelidir.
  • CS1677: 'number' parametresi 'anahtar sözcük' anahtar sözcüğüyle bildirilmemelidir.
  • CS1678: 'number' parametresi 'type1' türü olarak bildirilir ancak 'type2' olmalıdır.
  • CS1688: Bir veya daha fazla out parametresi olduğundan, parametre listesi olmayan anonim yöntem bloğu 'delegate' temsilci türüne dönüştürülemiyor.
  • CS1731: Bloktaki dönüş türlerinden bazıları temsilci dönüş türüne örtük olarak dönüştürülemediğinden ifade temsilciye dönüştürülemiyor.
  • CS1732: Beklenen parametre.
  • 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.
  • CS8934: Dönüş türü temsilci dönüş türüyle eşleşmediğinden anonim yöntem 'type' türüne dönüştürülemiyor.
  • CS8975: 'var' bağlamsal anahtar sözcüğü açık lambda dönüş türü olarak kullanılamaz.
  • CS9098: Örtük olarak yazılan lambda parametresi '...' varsayılan değere sahip olamaz.

Bu hatalar lambda ifade parametresi veya dönüş türü bildirimiyle ilgili bir sorunu gösterir. Lambda parametresi ve dönüş türleriyle ilgili kuralların tamamı için C# belirtiminin lambda ifadeleri, anonim yöntemler ve anonim işlev ifadeleri bölümüne bakın.

Uyarı

CS1731 ve CS1732 artık C# derleyicisinin (Roslyn) geçerli sürümü tarafından üretilmemiştir. Daha eski bir derleyici sürümü kullanıyorsanız bunlar görünebilir.

Aşağıdaki yönergeleri kullanarak bu hataları düzeltebilirsiniz:

  • Lambda ifadesindeki tüm parametrelerin aynı yazma stilini kullandığından emin olun. Bir lambda birden çok parametreye sahip olduğunda, her parametre açıkça yazılmalıdır veya örtük olarak yazılmalıdır; aynı parametre listesindeki (CS0748) iki stili karıştıramazsınız.
  • Varsayılan değeri olan herhangi bir lambda parametresine açık türler ekleyin. Varsayılan değeri kodlayan özel bir temsilci türü oluşturması gerektiğinden, derleyici varsayılan değerleri içeren parametrelerde açık türler gerektirir. Örtük olarak yazılan parametreler, derleyicinin bu temsilci türünü (CS1065, CS9098) oluşturması için yeterli bilgi sağlamaz.
  • işleci kullanılarakdelegate bildirilen anonim yöntemlerden varsayılan parametre değerlerini kaldırın. Varsayılan parametre değerleri anonim yöntemlerde değil yalnızca lambda ifadelerinde desteklenir. Varsayılan değerlere (CS1065) ihtiyacınız varsa anonim yöntemi lambda ifadesine dönüştürün.
  • Lambda veya anonim yöntemin parametre türlerini, ref/out/indeğiştiricilerini ve parametre sayısını hedef temsilci türüyle eşleştirin. Derleyici, anonim bir işlevi temsilciye dönüştürürken parametre imzalarının tam eşleşmesini gerçekleştirir: her parametrenin doğru türe sahip olması ve herhangi bir ref, outveya in değiştiricinin tam olarak temsilcinin beklediği zaman mevcut olması gerekir (CS1661, CS1676, CS1677, CS1678).
  • Hedef temsilci türünde out parametreler olduğunda anonim yönteme parametre listesi ekleyin. Parametre listesi olmadan bildirilen anonim bir yöntem (söz dizimi kullanılarak delegate { } ) çoğu temsilci türüyle eşleşebilir, ancak derleyici gerekli out parametreleri örtük olarak sentezleyemez. Parametreleri temsilci imzasıyla (CS1688) eşleşecek şekilde açıkça bildirin.
  • Hedef temsilci türü geçersiz olmayan bir dönüş türüne sahip olduğunda lambda veya anonim yöntemdeki tüm kod yollarının bir değer döndürdiğinden emin olun. Gövdedeki her dal, temsilcinin dönüş türüne (CS1643, CS1662, CS1731, CS8934) örtük olarak dönüştürülebilen bir dönüş değeri üretmelidir.
  • Lambda veya anonim bir yöntemden, değeri void-dönüşlü bir temsilci türüne atanmış herhangi bir return ifadesini kaldırın. Temsilcinin dönüş türü void olduğundan, gövde değer döndüremez (CS8030).
  • Öznitelikler herhangi bir lambda parametresine uygulandığında parametre listesini parantez içine alın. Derleyicinin öznitelik söz dizimini diğer ifadelerden ayırt etmek için ayraçlı forma ihtiyacı vardır. Örneğin, (([MyAttribute] int x) => x) yerine [MyAttribute] x => x yazın.
  • Lambda ifadesinin var açık dönüş türü yerine belirli bir tür adı kullanın. anahtar sözcüğü varörtük olarak yazılan yerel değişkenler için ayrılmıştır ve lambda dönüş türü ek açıklaması olarak kullanılamaz. Gerçek dönüş türünü belirtin veya dönüş türünü atlayın ve derleyicinin bunu çıkarmasına izin verin (CS8975).
  • Derleyicinin bunu geçerli bir parametre bildirimi olarak tanıyabilmesi için parametre listesini düzeltin. Bu hata, derleyicinin parametre tanımlayıcısı beklediği ancak başka bir şey bulduğu (CS1732) hatalı biçimlendirilmiş parametre listesini gösterir.

Lambda ifadesi temsilci türü

  • CS0407: 'method' yanlış dönüş türüne sahip.
  • CS0428: 'Identifier' yöntem grubu temsilci olmayan 'type' türüne dönüştürülemiyor. Yöntemini çağırmayı amaçladınız mı?
  • CS0467: Uyarı: 'method' yöntemi ile 'yöntem dışı' yöntemi arasındaki belirsizlik. Yöntem grubunu kullanma.
  • CS0815: Örtük olarak türü belirlenmiş bir değişkene 'ifade' atanamaz.
  • CS0828: Anonim tür özelliğine 'ifade' atanamıyor.
  • CS1660: Lambda ifadesi bir temsilci türü olmadığından 'type' türüne dönüştürülemiyor.
  • CS8917: Temsilci türü çıkarılamadı.
  • CS8974: Uyarı: Yöntem grubu 'method' temsilci olmayan 'type' türüne dönüştürülüyor. Yöntemini çağırmayı amaçladınız mı?
  • CS9099: Uyarı: Varsayılan parametre değeri hedef temsilci türünde eşleşmiyor.
  • CS9100: Uyarı: Parametrenin lambda'da params değiştiricisi var, ancak hedef temsilci türünde yok.

Bu hatalar, derleyicinin lambda ifadesi, anonim yöntem veya yöntem grubu için çıkarım yaptığı veya beklediği temsilci türüyle ilgili bir sorunu gösterir. Temsilci dönüştürmeleriyle ilgili kuralların tamamı için C# belirtiminin lambda ifadeleri, anonim yöntemler ve anonim işlev ifadeleri bölümüne bakın.

Uyarı

C# derleyicisinin (Roslyn) geçerli sürümü CS0467 üretmez. Daha eski bir derleyici sürümü kullanıyorsanız bu hatayı görebilirsiniz.

Aşağıdaki yönergeleri kullanarak bu hataları düzeltebilirsiniz:

  • Atamanın veya dönüştürmenin hedef türünün bir temsilci türü veya System.Linq.Expressions.Expressionolduğundan emin olun. Lambda ifadesi veya anonim yöntem, veya arabirimi gibi object temsilci olmayan bir türe atanamaz. Değişkenin türünü Func<> veya Action<> gibi uyumlu bir temsilci türüyle değiştirin ya da derleyicinin temsilci türünü çıkarmasına izin vermek için var kullanın (CS1660).
  • Lambda ifadesi için tek bir temsilci türünü belirlemek üzere derleyici için yeterli bağlam sağlayın. öğesine varatandığında, derleyicinin belirsiz bir dönüş türüne ve parametre listesine ihtiyacı vardır. Anonim bir tür özelliğine atandığında, derleyici bir delege türünü hiç çıkaramaz. Lambda'yı açık bir temsilci türüne sahip bir değişkene atayın, ardından anonim tür başlatıcıda (CS0815, CS0828, CS8917) bu değişkeni kullanın.
  • Yöntem grubunun dönüş türünü temsilcinin bildirilen dönüş türüyle eşleştirin. Yöntem grubu dönüştürme, yöntemin dönüş türünün kimlik dönüştürülebilir veya örtük olarak temsilcinin dönüş türüne dönüştürülebilir olmasını gerektirir. Yöntemin dönüş türünü değiştirin veya temsilci türünü eşleşecek şekilde değiştirin (CS0407).
  • Hedef tür temsilci olmadığında yöntem grubunu atamak yerine yöntemini çağırın. Hedef tür string, int veya başka bir temsilci olmayan türse, büyük olasılıkla yöntemi çağırmayı ve sonucunu atamayı amaçlamışsınızdır. yöntemini çağırmak için parantezler ve bağımsız değişkenler ekleyin (CS0428, CS8974).
  • Metot ve aynı adı taşıyan metot dışı bir üye arasındaki belirsizliği çözün. Çakışan üyelerden birini yeniden adlandırın veya belirsizliği kaldırmak için tam niteleyici referans kullanın (CS0467).
  • Hedef temsilci türü standart veya params tür olduğunda Func<> veya Action<> değiştiricisini kaldırın. Varsayılan değerler ve params değiştiriciler, derleyicinin Func<> ile Action<>'ye eşleşmeyen özel tanımlı bir delege türü oluşturmasına neden olur. Derleyicinin doğru temsilci türünü sentezlemesine izin vermek için kullanın var veya lambdanın bildirilen temsilci türüyle (params, CS9100) eşleşmesi için varsayılan değeri veya değiştiriciyi kaldırın.