Kayıt bildirimleriyle ilgili hataları ve uyarıları düzeltme

C# derleyicisi , kayıt türlerini kötüye kullandığınızda hatalar ve uyarılar oluşturur. Kayıt türleri, değer tabanlı eşitlik uygulayan yerleşik üyeler sağlar. Bu tanılamalar, kayıt türlerini bildirme ve kullanma kurallarını izlemenize yardımcı olur.

  • CS8851: 'type', 'Equals'u tanımlıyor ama 'GetHashCode'u tanımlamıyor.
  • CS8857: bir with ifadenin alıcısı geçersiz olmayan bir türe sahip olmalıdır.
  • CS8858: 'type' alıcı türü geçerli bir kayıt türü değil ve yapı türü değil.
  • CS8859: 'Clone' adlı üyelere kayıtlarda izin verilmiyor.
  • CS8860: Türler ve diğer adlar 'record' olarak adlandırılmamalıdır.
  • CS8864: Kayıtlar yalnızca nesneden veya başka bir kayıttan devralabilir.
  • CS8865: Kayıtlardan yalnızca kayıtlar devralabilir.
  • CS8866: 'member' kayıt üyesinin, 'parameter' konumsal parametresiyle eşleşebilmesi için 'type' türünde okunabilir bir örnek özelliği veya alanı olması gerekir.
  • CS8869: 'member', 'object' öğesinden beklenen yöntemi geçersiz kılmaz.
  • CS8870: 'üye' mühürlenemez çünkü içinde bulunduğu kayıt mühürlü değil.
  • CS8871: 'member', 'type' öğesinden beklenen yöntemi geçersiz kılmaz.
  • CS8872: İçeren kayıt korumalı olmadığından 'üye' geçersiz kılmaya izin vermelidir.
  • CS8873: Kayıt üyesi 'üye' genel olmalıdır.
  • CS8874: Kayıt üyesi 'member' 'type' döndürmelidir.
  • CS8875: Kayıt üyesi 'üye' korunmalıdır.
  • CS8876: 'member', 'type' öğesinden beklenen özelliği geçersiz kılmaz.
  • CS8877: Kayıt üyesi 'member' statik olamaz.
  • CS8879: Kayıt üyesi 'üye' özel olmalıdır.
  • CS8906: Kayıt eşitlik sözleşmesi özelliği 'member' get erişimcisine sahip olmalıdır.
  • CS8908: 'type' türü bir kaydın alanı için kullanılamayabilir.
  • CS8913: Bu parametreye karşılık gelen 'member' konumsal üyesi gizlenir.

Ayrıca, bu makale aşağıdaki uyarıyı kapsar:

  • CS8907: 'name' parametresi okunmadı. Özelliği bu adla başlatmak için kullanmayı unuttun mu?

Birleştirilmiş üye imzaları

  • CS8869: 'member', 'object' öğesinden beklenen yöntemi geçersiz kılmaz.
  • CS8870: 'Member' içerdiği kayıt mühürlü olmadığından mühürlü olamaz.
  • CS8871: 'member', 'type' öğesinden beklenen yöntemi geçersiz kılmaz.
  • CS8872: İçeren kayıt korumalı olmadığından 'üye' geçersiz kılmaya izin vermelidir.
  • CS8873: Kayıt elemanı 'üye' herkese açık olmalıdır.
  • CS8874: Kayıt üyesi 'member', 'type' döndürmelidir.
  • CS8875: Kayıt üyesi 'üye' korunmalıdır.
  • CS8876: 'member', 'type' öğesinden beklenen özelliği geçersiz kılmaz.
  • CS8877: Kayıt üyesi 'member' statik olmayabilir.
  • CS8879: Kayıt üyesi 'üye' özel olmalıdır.
  • CS8906: Kayıt eşitliği sözleşmesi özelliği 'member' bir get erişimciye sahip olmalıdır.

Derleyicinin bir kayıt türü için başka bir şekilde sentezleyecei bir üyeyi açıkça bildirdiğinizde, bildiriminizin beklenen imza, erişilebilirlik ve değiştiriciler ile eşleşmesi gerekir. Kuralların tamamı için C# dil belirtimindeki kayıt belirtimine bakın.

Bu hataları düzeltmek için, açıkça bildirilen kayıt üyelerinize aşağıdaki değişiklikleri uygulayın:

  • Equals metodunun, GetHashCode, ToString deconstruct metodu, EqualityContract özelliği veya op_Equality ile op_Inequality işleçlerinin erişilebilirliğini public olarak değiştirin. Derleyici, değer tabanlı eşitliğin tüm çağrı bağlamlarında (CS8873) düzgün çalışması için bu üyelerin genel olarak erişilebilir olmasını gerektirir.
  • Mühürsüz bir kayıt sınıfında bildirdiğinizde, PrintMembers yönteminin erişilebilirliğini protected olarak değiştirin. Yöntemin nedeni, türetilmiş kayıtların protected (CS8875) kendi özelliklerini eklemek için bunu geçersiz kılmasıdır.
  • Korumalı bir kayıt sınıfında veya kayıt yapısında bildirdiğinizde yönteminin PrintMembers erişilebilirliğini private olarak değiştirin. Türetilmiş tür olmadığından, yöntemin türün (CS8879) dışında erişilebilir olması gerekmez.
  • Herhangi bir açıkça belirtilmiş sentezlenmiş üyenin static değiştiricisini kaldırın. Sentezlenmiş üyeler eşitlik karşılaştırması, biçimlendirme ve kopyalama gibi davranışları uygulamak için belirli kayıt örnekleri üzerinde çalışır, bu nedenle örnek üyeleri olmalıdır (CS8877).
  • Üyenin dönüş türünü derleyicinin beklediği türle eşleşecek şekilde değiştirin. Örneğin, EqualityContract özelliği döndürmelidir System.Typeve Equals yöntemi döndürmelidir bool. Derleyici, eşitlik ve diğer sentezlenmiş davranışlar (CS8874) için doğru kod oluşturmak için bu tam dönüş türlerine dayanır.
  • Mühürsüz kayıttaki açıkça bildirilen sentezlenmiş üyeden sealed değiştiriciyi kaldırın. Türetilmiş kayıtların, kendi değer tabanlı eşitlik ve biçimlendirme mantığını (CS8870) sağlamak için bu üyeleri geçersiz kılabilmesi gerekir.
  • Eksplisit olarak sağlanan sentezlenmiş üyeleri mühürsüz kayıtlar olarak virtual veya override olarak tanımlayın. Derleyici, devralma hiyerarşisindeki türetilmiş kayıtların davranışlarını özelleştirebilmesi için bu üyelerin geçersiz kılmaya izin vermelerini gerektirir (CS8872).
  • Üyenizin açıkça tanımlanan object veya temel kayıt türünün beklenen yöntemini geçersiz kıldığından emin olun. Örneğin, Equals ve object.Equals yöntemleri geçersiz kılınmalı, GetHashCode ise object.GetHashCode tarafından geçersiz kılınmalıdır. Derleyici, değer tabanlı eşitlik ve diğer sentezlenmiş davranışların tür hiyerarşisinde (CS8869, CS8871) doğru şekilde çalışması için bu üyelerin doğru geçersiz kılma zincirine katılıp katılmadığını denetler.
  • Açıkça bildirilen EqualityContract özelliğinizin temel kaydın EqualityContract özelliğini geçersiz kıldığından emin olun. Derleyici, devralma hiyerarşisinde (CS8876) çalışma zamanında kayıt türlerini ayırt etmek için eşitlik sözleşmesinin geçersiz kılma zincirine güvenir.
  • EqualityContract özelliğine bir get erişimci ekleyin. Derleyici, iki kayıt örneğinin aynı türde olup olmadığını belirlemek için çalışma zamanında eşitlik sözleşmesini okur, bu nedenle özelliğin okunabilir olması gerekir (CS8906).

Pozisyonel üyeler

  • CS8866: 'member' kayıt üyesinin 'parameter' konumsal parametresiyle eşleşmesi için okunabilir bir örnek özelliği veya 'type' türünde bir alan olması gerekir.
  • CS8907: 'name' parametresi okunmadı. Özelliği bu adla başlatmak için kullanmayı unuttun mu?
  • CS8908: 'type' türü bir kaydın alanı için kullanılamayabilir.
  • CS8913: Bu parametreye karşılık gelen 'member' konumsal üyesi gizlenir.

Bir konumsal kayıt bildirdiğinizde, derleyici her konumsal parametreye karşılık gelen özellikleri sentezler. Bu tanılamalar, açık bildirimlerinizin bu sentezlenen özelliklerle çakıştığını gösterir. Kuralların tamamı için C# dil belirtimindeki kayıt belirtimine bakın.

Bu hataları düzeltmek için konumsal kayıt bildirimlerinize aşağıdaki değişiklikleri uygulayın:

  • Bir konumsal parametreye karşılık gelen açıkça bildirilen herhangi bir üyeyi, parametresiyle aynı türe sahip okunabilir bir örnek özelliği veya alanı olacak şekilde değiştirin. Derleyicinin, sentezlenen Deconstruct yöntem ve konumsal desen eşleştirmesinin değere doğru şekilde erişebilmesi için üyenin okunabilir ve tür uyumlu olması gerekir (CS8866).
  • Açık bir oluşturucu sağladığınızda, her konumsal parametrenin oluşturucu gövdesinde karşılık gelen özelliğini başlatmasını sağlayın. Bir parametre kullanılmadığında, derleyici bir uyarı verir; çünkü bu durum genellikle, parametre adı ile özellik adı arasında bir yazım hatası veya uyumsuzluk olduğunu ve bu nedenle özelliğin başlatılmamış kalacağını gösterir (CS8907).
  • Kayıtta bildirilen alanın türünü bu bağlamda geçerli bir türle değiştirin. Kayıt türleri tüm alanların yığın ayırma ve değer tabanlı eşitlik (Span<T>) ile uyumlu olmasını gerektirdiği için, veya diğer ref struct türler gibi bazı türler kayıtta alan olarak kullanılamaz.
  • Türetilmiş bir kayıttaki, temel kaydın konumsal üyesini gizleyen üyeden new değiştiricisini kaldırın. Konumsal üye gizlendiğinde, derleyici, birleştirilmiş Deconstruct yöntemi ve konumsal desen eşleştirmeyi (CS8913) bozan ilgili özelliğiyle konumsal parametreyi eşleştiremez.

Eşitlik üyeleri

  • CS8851: 'türü', 'Equals' tanımlar fakat 'GetHashCode' tanımlamaz
  • CS8857: bir with ifadenin alıcısı geçersiz olmayan bir türe sahip olmalıdır.
  • CS8858: 'type' alıcı türü geçerli bir kayıt türü değil ve yapı türü değil.

Kayıt türleri yerleşik değer tabanlı eşitlik sağlar. Bu tanılamalar, bildirimleriniz eşitlik sözleşmesiyle çakıştığında ortaya çıkar. Eşitlik kurallarının tamamı için bkz. eşitlik karşılaştırmaları.

Bu hataları düzeltmek için aşağıdaki değişiklikleri uygulayın:

  • GetHashCode Yöntemini her tanımladığınızda bir Equals yöntem ekleyin. Eşitlik sözleşmesi, eşit olarak kabul edilen nesnelerin aynı karma kodu üretmesini gerektirir, bu nedenle derleyici bu iki yöntemin her zaman birlikte tanımlanmasını zorunlu kılar (CS8851).
  • İfadenin alıcısını withkayıt türü veya yapı türü olacak şekilde değiştirin. with ifadesi, türler için struct değer kopyalama semantiğini veya record kopya oluşturucuyu kullanarak değiştirilmiş bir kopya oluşturur (CS8858).
  • birwith ifadenin alıcısının boş olmayan bir türe sahip olduğundan emin olun. İfade, with alıcının yeni bir kopyasını oluşturur, bu nedenle alıcının kopyalanabilir bir değere (CS8857) değerlendirmesi gerekir.

Kayıt devralma

  • CS8864: Kayıtlar yalnızca nesneden veya başka bir kayıttan devralabilir
  • CS8865: Kayıtlardan yalnızca kayıtlar devralabilir.

Kayıt sınıfı türleri belirli devralma kurallarını izler. Kuralların tamamı için C# dil belirtimindeki kayıt belirtimine bakın.

Bu hataları düzeltmek için aşağıdaki değişiklikleri uygulayın:

  • Bir kayıt sınıfının temel türünü, object veya başka bir kayıt sınıfından devralacak şekilde değiştirin. Kayıt türleri, yalnızca diğer kayıt türleriyle uyumlu olan eşitlik ve kopyalama için derleyici tarafından sentezlenen üyelere güvenir, bu nedenle derleyici bir kaydın kayıt dışı bir sınıftan (CS8864) devralmasına izin vermez.
  • Kayıt sınıfından devralan kayıt olmayan bir sınıfı, bunun yerine bir kayıt sınıfı olarak bildirmek üzere değiştirin. Kayıt türleri eşitliği, kopyalamayı ve tutarlı bir devralma zincirine bağımlı olan diğer üyeleri sentezlediğinden, derleyici hiyerarşideki her türün bir kayıt sınıfı (CS8865) olmasını gerektirir. Kayıt yapısı türleri, arabirimleri uygulamanın ötesinde devralma hiyerarşilerine katılamaz.

Ayrılmış üye adları

  • CS8859: 'Clone' adlı üyelere kayıtlarda izin verilmiyor.
  • CS8860: Türler ve takma adlar 'record' olarak adlandırılmamalıdır.

Derleyici, kayıt tipleriyle kullanmak üzere belirli adları ayırır. Kuralların tamamı için C# dil belirtimindeki kayıt belirtimine bakın.

Bu hataları düzeltmek için aşağıdaki değişiklikleri uygulayın:

  • Kayıt türünde adı verilen Clone herhangi bir üyeyi farklı bir adla yeniden adlandırın. Derleyici, ifadeler için kopyalama semantiğini uygulamak amacıyla Clone dahili olarak kullanır with, bu nedenle kendi üyenizi bildirmek sentezlenmiş uygulamayla (Clone) çakışıyor.
  • record adlı herhangi bir tür veya takma adın ismini değiştirin. record Kayıt türlerini bildirmek için kullanılan bağlamsal bir anahtar sözcük olduğundan, türü veya diğer adı record adlandırmak hem derleyicinin hem de kodu okuyan geliştiricilerin (CS8860) kafasını karıştırabilecek bir belirsizlik oluşturur.