Birleşim türü ve kapalı hiyerarşi bildirimleri için hataları ve uyarıları düzeltme

Birleşim türlerini veya kapalı tür hiyerarşilerini kötüye kullandığınızda C# derleyicisi hata oluşturur. Birleşim türü, örtük dönüşümleri ve tam kapsamlı desen eşleştirmesini destekleyen, birden fazla durum türünden biri olabilen bir değeri temsil eder. Kapalı hiyerarşiler, hangi türlerin temel türden türetilebileceğini kısıtlar. Bu tanılamalar birleşim türlerini ve kapalı hiyerarşileri bildirme ve kullanma kurallarını izlemenize yardımcı olur.

  • CS9370: Birleşim bildirimi en az bir durum türü belirtmelidir.
  • CS9371: Örtük başvuru veya kutulama dönüştürmesi yoluyla 'type' türü 'object' türüne dönüştürülemez.
  • CS9373: 'union' bildiriminde örnek alanlarına, otomatik özelliklere veya alan benzeri olaylara izin verilmez.
  • CS9374: 'union' bildiriminde tek bir parametreyle açıkça bildirilen ortak oluşturuculara izin verilmez.
  • CS9375: 'union' bildiriminde bildirilen bir oluşturucu, sentezlenmiş bir oluşturucuyu veya açıkça bildirilen bir oluşturucuyu çağıran bir 'this' başlatıcıya sahip olmalıdır.
  • CS9380: Türler ve diğer adlar 'kapalı' olarak adlandırılamaz.
  • CS9381: 'type': Kapalı bir tür kapatılamaz veya statik olamaz
  • CS9382: 'type': Başka bir derlemeden kapalı bir 'tür' türünü temel tür olarak kullanamaz.
  • CS9383: 'type': Temel tür kapalı olduğundan, 'parameter' tür parametresine 'type' temel türünde başvurulması gerekir.
  • CS9384: 'type': Kapalı bir tür, her zaman örtük olarak soyut olduğundan abstract olarak işaretlenemez.
  • CS9385: Birleşim türünün en az bir birleşim oluşturma üyesi olmalıdır.
  • CS9386: Birleşim üyesi sağlayıcı türü 'object?' veya 'object' türünde bir 'Value' örneği özelliğine sahip olmalıdır. Özelliğin ortak get erişimcisine sahip olması gerekir.
  • CS9387: 'union' bildirimi birleşim üyesi sağlayıcı arabirimini kullanamaz.

Birlik bildirimi gereksinimleri

  • CS9370: Bir union bildirimi en az bir durum türü belirtmelidir.
  • CS9371: 'type', örtük başvuru veya kutulama dönüştürmesi yoluyla 'object' türüne dönüştürülemez.

Birleşim bildirimi, bir ad ve durum türlerinin listesini belirtir. Bu hatalar, geçerli bir birleşim bildiriminin yapısal gereksinimlerini uygular. Kuralların tamamı için birleşim türleri özellik belirtimine bakın.

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

  • Birleşimin tür listesine (CS9370) en az bir vaka türü ekleyin. Bir birleşimin amacı kapalı bir alternatif kümesini temsil etmektir, bu yüzden bir birleşimin bir veya daha fazla durum türü olmalıdır. Vakalar için türler belirtilmemişse union Empty() gibi bir bildirim anlamlı değildir.
  • Örtük referans veya boxing dönüştürmesi (object) aracılığıyla dönüştürülmeyen durum türlerini değiştirin veya kaldırın. Birleşim türleri içeriklerini tek object? başvuru olarak depolar, bu nedenle her bir durum tipinin object'e dönüştürülebilir olması gerekir. İşaretçiler veya ref struct türler gibi türler bu gereksinimi karşılamaz. Bunları kutulanabilen veya referans olarak saklanabilen bir sarmalayıcı türüyle değiştirin.

Birleşim üyesi kısıtlamaları

  • CS9373: 'union' bildiriminde örnek alanlarına, otomatik özelliklere veya alan benzeri olaylara izin verilmez.
  • CS9374: 'union' bildiriminde tek bir parametreyle açıkça bildirilen ortak oluşturuculara izin verilmez.
  • CS9375: 'union' bildiriminde bildirilen bir oluşturucu, sentezlenmiş bir oluşturucuyu veya açıkça bildirilen bir oluşturucuyu çağıran bir 'this' başlatıcıya sahip olmalıdır.

Birleşim bildirimi, ek üyeler içeren bir gövde içerebilir, ancak derleyici bildirebileceklerinizi kısıtlar. Bu kısıtlamalar, derleyici tarafından oluşturulan dönüştürme oluşturucularının ve depolama mekanizmasının düzgün çalışmasını sağlar. Kuralların tamamı için birleşim türleri özellik belirtimine bakın.

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

  • Birleşim gövdesinden (CS9373) örnek alanlarını, otomatik uygulanan özellikleri ve alan benzeri olayları kaldırın. Birleşim yeni veri üyeleri tanımlamaz. Mevcut türleri belirli bir alternatifler kümesine birleştirir. Durum türlerinin kendisinde herhangi bir ek durum tanımlayın veya birleşimde statik üyeleri kullanın.
  • Tek bir parametre (CS9374) alan açıkça bildirilen ortak oluşturucuların erişilebilirliğini kaldırın veya değiştirin. Derleyici, örtük birleşim dönüştürmelerini desteklemek üzere her durum türü için genel bir tek parametreli oluşturucu oluşturur. Aynı şekle sahip açık bir oluşturucu, oluşturulan oluşturucularla çakişer. Tek parametreli bir oluşturucuya ihtiyacınız varsa bunu internal veya private olarak yapın.
  • Açık olarak bildirilen herhangi bir oluşturucuya bir this başlatıcı ekleyerek sentezlenmiş bir oluşturucuya veya açıkça bildirilen başka bir oluşturucuya (CS9375) zincir oluşturmasını sağlayın. Derleyici tarafından oluşturulan yapıcılar, birleşimin iç depolama alanını doğru şekilde başlatır. Kendi içinde zincirlemeyen yapıcılar, bu durumda birliği geçersiz hale getirebilir. Oluşturulan bir tür yapıcıya zincirleme yapmak için : this(someValue) veya tanımladığınız parametresiz bir yapıcıya zincirleme yapmak için : this() kullanın.

Birleşim üyesi sağlayıcı gereksinimleri

  • CS9385: Birleşim türünün en az bir birleşim oluşturma üyesi olmalıdır.
  • CS9386: Birleşim üyesi sağlayıcı türü 'object?' veya 'object' türünde bir 'Value' örneği özelliğine sahip olmalıdır. Özelliğin ortak get erişimcisine sahip olması gerekir.
  • CS9387: 'union' bildirimi birleşim üyesi sağlayıcı arabirimini kullanamaz.

Bir birleşim üyesi sağlayıcısı, birleşim desenini union anahtar sözcüğü yerine bir arabirim aracılığıyla uygulayan bir türdür. Bu hatalar, birleşim üyesi sağlayıcı desenine katılan türler için yapısal gereksinimleri uygular. Kuralların tamamı için birleşim türleri özellik belirtimine bakın.

Bu hataları düzeltmek için birleşim üyesi sağlayıcınıza aşağıdaki değişiklikleri uygulayın:

  • Türüne en az bir birleşim oluşturma üyesi ekleyin (CS9385). Birleşim türü, birleşimin değerlerinin durum türlerinden oluşturulabilmesi için en az bir oluşturma üyesi (statik fabrika yöntemi veya örtük dönüşüm gibi) sunmalıdır.
  • Üye sağlayıcı türüne, object? veya object türünde ve genel bir get erişimcisine sahip genel bir örnek Value özelliği ekleyin (CS9386). Value özelliği, çalışma zamanının depolanan değeri birleşimden alma yöntemidir. Bu olmadan birleşim, desen eşleştirme ya da doğrudan erişim için içeriğini açığa çıkaramaz.
  • Birleşim üyesi sağlayıcı arabirimini union bildirimden (CS9387) kaldırın. Bir union bildirimi, kendi üye sağlayıcısı uygulamasını oluşturur. union anahtar sözcüğünü doğrudan kullanan bir türde birleşim üyesi sağlayıcısı arabirimi belirtemezsiniz. Üye sağlayıcı arabirimini yalnızca birleşim desenini el ile uygulayan türlerde kullanın.

Kapalı hiyerarşi kısıtlamaları

  • CS9380: Türler ve takma adlar closed olarak adlandırılamaz.
  • CS9381: 'type': Kapalı bir tür kapatılamaz veya statik olamaz
  • CS9382: 'type': Başka bir derlemeden kapalı bir 'tür' türünü temel tür olarak kullanamaz.
  • CS9383: 'type': Taban tür 'type' kapalı olduğundan, 'parameter' tür parametresine başvurulmalıdır.
  • CS9384: 'type': Kapalı bir tür her zaman örtük olarak soyut olduğundan soyut olarak işaretlenemez.

Kapalı tür hiyerarşisi, hangi türlerin temel türden türetilebileceğini kısıtlar. Derleyici, türetilmiş türler kümesinin bilindiğinden ve kapsamlı olduğundan emin olmak için bu kısıtlamaları uygular. Kuralların tamamı için kapalı hiyerarşiler özellik belirtimine bakın.

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

  • Adlı herhangi bir türü veya diğer adı closedyeniden adlandırın çünkü closed bu bağlamda ayrılmış bir anahtar sözcüktür (CS9380). Anahtar sözcükle çakışmayan farklı bir ad seçin.
  • Kapalı bir türden sealed veya static değiştiricisini kaldırın (CS9381). Kapalı bir tür örtük olarak soyuttur (ondan türetilmesi gerekir), bu nedenle onu sealed (türetmeyi önler) veya static (örneklemeyi ve türetmeyi önler) olarak işaretlemek amacıyla çelişir.
  • Başka bir derlemede (CS9382) bildirilen kapalı bir tür türetmeyin. Kapalı hiyerarşilerin tüm alt türleri temel türle aynı derlemede tanımlanmış olmalıdır. Bu kısıtlama, derleyicinin kapsamlı desen eşleştirmesi gerçekleştirmesini sağlar. Türetilmiş türü kapalı temel türle aynı derlemeye taşıyın veya devralma ilişkisini kaldırın.
  • Temel tür kapatıldığında (CS9383) genel bir alt türün her tür parametresinin temel tür başvurusunda göründüğünden emin olun. Kapalı hiyerarşi tüm alt türlerin kapsamlı bir şekilde bilinmesini gerektirdiğinden, bir alt türdeki her tür parametresi temel tür aracılığıyla kısıtlanmalıdır. Temel türde bir tür parametresine başvurulmazsa, derleyici tüm olası örneklemeleri numaralandıramaz.
  • Değiştiriciyi abstract kapalı tür bildiriminden (CS9384) kaldırın. Kapalı bir tür her zaman örtük olarak soyuttur çünkü türetilmiş türlerden oluşan sınırlı bir küme için temel görevi görür. abstract öğesini açıkça eklemek gereksizdir ve türün diğer kapalı türlerden anlam bakımından farklı olup olmadığı konusunda karışıklığı önlemek için buna izin verilmez.