Temsilci ve işlev işaretçileri için hataları ve uyarıları düzeltme

Bu makale aşağıdaki derleyici hatalarını ve uyarılarını kapsar:

  • CS0059: Tutarsız erişilebilirlik: 'type' parametre türü, temsilci 'temsilci'den daha az erişilebilir.
  • CS0123: 'method' için aşırı yükleme yok, temsilci 'temsilci' ile eşleşir.
  • CS0148: Temsilci 'temsilci' geçerli bir oluşturucuya sahip değil.
  • CS0410: 'method' için hiçbir aşırı yükleme doğru parametreye ve dönüş türlerine sahip değil.
  • CS0644: 'class' özel 'class' sınıfından türetilemez.
  • CS1599: Bir yöntemin, temsilcinin veya işlev işaretçisinin dönüş türü 'tür' olamaz.
  • CS1958: Nesne ve koleksiyon başlatıcı ifadeleri temsilci oluşturma ifadesine uygulanamayabilir.
  • CS8755: 'değiştirici', işlev işaretçisi parametresinde değiştirici olarak kullanılamaz.
  • CS8756: İşlev işaretçisi 'type' 'count' bağımsız değişkenlerini almaz.
  • CS8757: 'method' için aşırı yükleme yok, 'type' işlev işaretçisi ile eşleşir.
  • CS8758: 'method' ile fonksiyon işaretçisi 'type' arasındaki başvuru uyuşmazlığı.
  • CS8759: Statik bir yöntem olmadığından 'method' için işlev işaretçisi oluşturulamıyor.
  • CS8786: 'convention' çağrı düzeni 'convention' ile uyumsuz.
  • CS8787: Yöntem grubu işlev göstergesine dönüştürülemiyor. (Bir '&' eklemeyi mi unuttunuz?)
  • CS8788: '&' işlecinin hedefi olarak bir alıcıya sahip uzantı yöntemi kullanılamaz.
  • CS8789: Fixed bir deyim içinde bildirilen yerel değişkenin türü, işlev işaretçisi türü olamaz.
  • CS8806: 'convention' çağrısı kuralı dil tarafından desteklenmiyor.
  • CS8807: 'specifier' bir işlev işaretçisi için geçerli bir çağrı kuralı tanımlayıcısı değil.
  • CS8808: 'değiştirici' geçerli bir işlev işaretçisi dönüş türü değiştiricisi değil. Geçerli değiştiriciler 'ref' ve 'ref readonly' şeklindedir.
  • CS8809: Bir dönüş türü yalnızca bir 'değiştirici' değiştiriciye sahip olabilir.
  • CS8811: 'Metot grubu 'method', 'type' temsilci türüne dönüştürülemiyor.
  • CS8909: Aynı işleve yönelik işaretçiler farklı olabileceğinden işlev işaretçilerinin karşılaştırılması beklenmeyen bir sonuç verebilir.
  • CS8911: Bu bağlamda işlev işaretçisi türü kullanılması desteklenmez.

Temsilci imzası uyuşmazlıkları

  • CS0059: Tutarsız erişilebilirlik: 'type' parametre türü, temsilci 'temsilci'den daha az erişilebilir.
  • CS0123: 'method' için temsilci 'delegate' ile eşleşen bir aşırı yükleme bulunmamaktadır.
  • CS0148: Temsilci 'temsilci' geçerli bir oluşturucuya sahip değil.
  • CS0410: 'method' için hiçbir aşırı yükleme doğru parametreye ve dönüş türlerine sahip değil.

Bir temsilci oluşturduğunuzda veya atadığınızda, derleyici hedef yöntemin imzasının temsilci türünün bildirimiyle eşleşdiğini doğrular. İmza parametre türlerini, dönüş türünü ve erişilebilirliği içerir. Kuralların tamamı için bkz. C# belirtimindeki Temsilciler ve Erişilebilirlik kısıtlamaları .

  • Temsilci bildirimindeki tüm parametre türlerini en az temsilcinin kendisi kadar erişilebilir türler (CS0059) olarak değiştirin. public Temsilci, parametre listesinde daha az erişilebilir bir türe başvuramaz çünkü derleme dışındaki çağıranlar bağımsız değişkeni sağlayamaz. Daha fazla bilgi için bkz. Erişim Değiştiricileri.
  • Parametre türlerinin ve dönüş türünün tam olarak eşleşmesi için yöntem imzasını veya temsilci imzasını ayarlayın (CS0123). Bir temsilciye bir yöntem atadığınızda derleyici tam bir imza eşleşmesi gerektirir.
  • Temsilcinin uyumlu bir derleyici (CS0148) tarafından derlendiğini doğrulayın. Bu hata, hatalı biçimlendirilmiş bir temsilci oluşturucu oluşturan bir derleyici tarafından oluşturulan yönetilen derlemeyi içeri aktardığınızda oluşur. Hatayı çözmek için derlemeyi standartlara uyumlu bir derleyiciyle yeniden derle.

Uyarı

CS0410 artık geçerli C# derleyicisi tarafından üretilmemiştir. Aynı koşul artık CS0123 üretir. Önceki derleyicilerle derlenen eski derlemeler yine de bu hata koduna başvurabilir.

CS0148 yalnızca derlemeye dayalı bir tanılamadır:

Uyarı

Bu uyarı yalnızca açık Derleme veya Yeniden Derleme işlemleri sırasında bildirilir. IntelliSense tanılamasının bir parçası olarak IDE'de yazma sırasında görünmez. Bu, alanı kullanarak veya kaldırarak uyarıyı düzeltirseniz, projeyi derleyene veya yeniden derleyene kadar uyarının hata listesinde kalabileceği anlamına gelir.

Temsilci türü kısıtlamaları

  • CS0644: 'class' özel 'class' sınıfından türetilemez.
  • CS1599: Bir yöntemin, temsilcinin veya işlev işaretçisinin dönüş türü 'tür' olamaz.
  • CS1958: Nesne ve koleksiyon başlatıcı ifadeleri temsilci oluşturma ifadesine uygulanamayabilir.

C# dili, dahil olmak üzere System.Delegatebelirli özel türleri nasıl kullanabileceğinizi kısıtlar. Temsilci bildirimleriyle ilgili kuralların tamamı için bkz. C# belirtimindeki Temsilciler ve Temsilciler .

  • Açık temel sınıfı kaldırın ve bunun yerine bir delegate bildirim kullanın (CS0644). Sınıflar System.Delegate, System.Enum, System.ValueType veya System.Array öğesinden açıkça devralamaz. Derleyici bu türleri örtük temel sınıflar olarak kullanır. Örneğin, her delegate bildirimi örtük olarak System.Delegate'den türetilir.
  • Dönüş türünü, dönüş değeri olarak izin verilen bir türle değiştirin (CS1599). .NET sınıf kitaplığındaki TypedReference, RuntimeArgumentHandle ve ArgIterator gibi bazı türler, güvenli olmayan yığın işlemlerini etkinleştirebileceğinden yöntemler, temsilciler veya işlev işaretçileri için dönüş türleri olarak kullanılamaz.
  • Temsilci oluşturma ifadesinden (CS1958) sonra ayraçları kaldırın. Temsilciler, nesne veya koleksiyon başlatıcı söz dizimi aracılığıyla ayarlayabileceğiniz üyelere sahip değildir. Eğer bir new DelegateType(method) ifadesinden sonra { } varsa, parantezleri kaldırın.

Fonksiyon işaretçisi imza uyuşmazlıkları

  • CS8755: 'değiştirici', işlev işaretçisi parametresinde değiştirici olarak kullanılamaz.
  • CS8756: İşlev işaretçisi 'type' 'count' bağımsız değişkenlerini almaz.
  • CS8757: 'method' için aşırı yükleme yok, 'type' işlev işaretçisi ile eşleşir.
  • CS8758: 'method' ile işlev işaretçisi 'tür' arasındaki referans uyuşmazlığı.
  • CS8759: Statik bir yöntem olmadığından 'method' için işlev işaretçisi oluşturulamıyor.
  • CS8787: Yöntem grubu işlev işaretçisine dönüştürülemiyor. (Bir '&' eksik mi?)
  • CS8788: '&' işlecinin hedefi olarak alıcılı bir uzantı yöntemi kullanılamaz.
  • CS8811: 'method' yöntem grubu, 'type' temsilci türüne dönüştürülemiyor.

Adres (&) işlecini kullanarak işlev işaretçisine bir yöntem atadığınızda, derleyici yöntemin imzasının işlev işaretçisi türüyle eşleştiğinden denetler. İşlev işaretçisi bildirimleri ve kullanımıyla ilgili kuralların tamamı için bkz. İşlev işaretçileri ve Güvenli olmayan kod.

  • desteklenmeyen değiştiriciyi işlev işaretçisi parametresinden (CS8755) kaldırın. İşlev işaretçisi parametreleri yalnızca ref, outve in değiştiricilerini destekler. gibi paramsdiğer parametre değiştiricileri, işlev işaretçisi türü bildirimlerinde geçerli değildir.
  • Çağrı sitesindeki bağımsız değişkenlerin sayısını işlev işaretçisinin parametre sayısıyla (CS8756) eşleşecek şekilde değiştirin. İşlev işaretçisi türü belirli bir sayıda parametre tanımlar ve tam olarak bu kadar çok bağımsız değişken geçirmeniz gerekir.
  • Yöntemin imzasını parametre türleri, dönüş türü ve parametre sayısının işlev işaretçisi türüyle (CS8757) eşleşeceği şekilde ayarlayın. Temsilcilerden farklı olarak, işlev işaretçileri uyumlu yöntem imzaları arasındaki örtük dönüştürmeleri desteklemez. Eşleşme kesin olmalıdır.
  • ref, out veya in değiştiricilerini, metodun parametreleri ile işlev işaretçisi türünün parametreleri arasında (CS8758) hizalayın. Her parametrenin "ref" türü tam olarak aynı olmalıdır. ref parametresi, işlev işaretçisi türündeki in veya out konumunu karşılayamaz.
  • Hedef yöntemi (static) olarak değiştirin. İşlev işaretçileri yalnızca statik yöntemleri işaret edebilir çünkü bunlar ilişkili bir nesne örneği olmadan ham işlev adreslerini temsil eder.
  • İşlev işaretçisine atama yaparken yöntem grubunun önüne & işlecini ekleyin (CS8787). Temsilcilerden farklı olarak, işlev işaretçileri açık adres işlecini gerektirir: delegate*<void> ptr = &MyMethod;.
  • Alıcı ile uzantı yöntemi yerine statik bir yöntem kullanın (CS8788). işleci & doğrudan yöntem başvurusu gerektirir. Bir örnekte çağrılan uzantı yöntemleri, bir işlev işaretçisinde yakalanamaz örtük bir alıcıya sahiptir.
  • & bunun yerine işleci kaldırın ve temsilci söz dizimini kullanın veya hedef türü temsilciden işlev işaretçisine (CS8811) değiştirin. & işleci, bir temsilci değil, bir işlev işaretçisi oluşturur. Bir yöntem grubunu temsilci türüne atamak için, &'i atlayın ve standart temsilci oluşturma söz dizimini kullanın.

İşlev işaretçisi çağırma kuralları ve dönüş türleri

  • CS8786: 'convention' çağırma sözleşmesi 'convention' ile uyumlu değil.
  • CS8806: 'convention' çağrısı kuralı dil tarafından desteklenmiyor.
  • CS8807: 'specifier' bir işlev işaretçisi için geçerli bir çağrı kuralı tanımlayıcısı değil.
  • CS8808: 'değiştirici' geçerli bir işlev işaretçisi dönüş türü değiştiricisi değil. Geçerli değiştiriciler 'ref' ve 'ref readonly' şeklindedir.
  • CS8809: Bir dönüş türü yalnızca bir 'modifiye edici' değiştiriciye sahip olabilir.

İşlev işaretçisi bildirimleri bir çağırma kuralı ve isteğe bağlı dönüş türü değiştiricileri içerir. Derleyici bu seçenekleri doğrular. Kuralların tamamı için bkz . İşlev işaretçileri.

  • Yöntemin çağırma kuralını veya işlev işaretçisi türünün çağırma kuralını eşleşeceği şekilde değiştirin (CS8786). İşlev işaretçisine bir yöntem atadığınızda, çağıran kuralların uyumlu olması gerekir. Örneğin, Cdecl kullanarak bir yöntem, Stdcall ile bildirilen bir işlev işaretçisine atanamaz.
  • İşlev işaretçisi bildiriminde (CS8806) desteklenen bir çağrı kuralı kullanın. Dil managed ve unmanaged destekler. Belirli bir yönetilmeyen kural için, unmanaged anahtar sözcüğü ile kuralı köşeli ayraçlar içinde kullanın, örneğin unmanaged[Cdecl], unmanaged[Stdcall], unmanaged[Thiscall] veya unmanaged[Fastcall].
  • Geçersiz tanımlayıcıyı desteklenen bir çağrı kuralıyla (CS8807) değiştirin. Kullanım gereksinimine göre köşeli ayraç içinde bir çağırma kuralı türü ile (örneğin, unmanaged[Cdecl]) managed, unmanaged veya unmanaged kullanın.
  • Yalnızca ref veya ref readonly dönüş türü değiştiricisi (CS8808) olarak kullanın. veya outgibi in diğer değiştiriciler, işlev işaretçisi dönüş türleri için geçerli değildir.
  • Yinelenen dönüş türü değiştiricisini kaldırarak yalnızca bir tane ref veya ref readonly görünür (CS8809). Derleyici, işlev işaretçisi bildiriminde en fazla bir dönüş türü değiştiricisine izin verir.

İşlev işaretçisi kullanım kısıtlamaları

  • CS8789: Sabit bir deyimdeki bildirilen yerel tür işlev işaretçisi türü olamaz.
  • CS8909: Aynı işleve yönelik işaretçiler farklı olabileceğinden işlev işaretçilerinin karşılaştırılması beklenmeyen bir sonuç verebilir.
  • CS8911: Bu bağlamda işlev işaretçisi türü kullanılması desteklenmez.

Derleyici, işlev işaretçisi türlerinin belirli bağlamlarda nasıl kullanılabileceğini kısıtlar. Kuralların tamamı için bkz . İşlev işaretçileri.

  • deyimindeki fixed yerel değişken türünü işlev işaretçisi türü (CS8789) yerine veri işaretçisi türüyle değiştirin. fixed deyimi, yönetilen nesneleri veri erişimi için belleğe sabitler. İşlev işaretçileri verileri değil kod adreslerini temsil eder ve sabitlenemez.
  • eşitlik için işlev işaretçilerini karşılaştırmaktan kaçının (CS8909). Bu uyarı, işlev işaretçilerini == veya != ile karşılaştırmanın beklenmeyen sonuçlara neden olabileceğini gösterir. Çalışma zamanı, thunking veya JIT derlemesi gibi uygulama ayrıntıları nedeniyle aynı işlev için farklı işaretçiler döndürebilir. Karşılaştırmanın kasıtlı olduğunu onayladığınızda uyarıyı bastırmak için kullanın #pragma warning disable CS8909.
  • İşlev işaretçisi kullanımını desteklenen bir bağlama taşıma (CS8911). İşlev işaretçisi türleri öznitelik argümanları veya typeof ifadeler gibi belirli konumlarda kullanılamaz. Desteklenmeyen bağlamlarda işlev işaretçisi türlerini kullanmaktan kaçınmak için kodu yeniden yapılandırın.