CA1033: Metode antarmuka harus dapat dipanggil berdasarkan jenis turunan
Properti | Nilai |
---|---|
ID Aturan | CA1033 |
Judul | Metode antarmuka harus dapat dipanggil oleh jenis turunan |
Golongan | Desain |
Perbaikan bersifat disruptif atau non-disruptif | Non-disruptif |
Diaktifkan secara default di .NET 9 | No |
Penyebab
Jenis yang terlihat secara eksternal yang tidak disegel menyediakan penerapan metode eksplisit dari antarmuka publik dan tidak memberikan metode alternatif yang terlihat secara eksternal yang memiliki nama yang sama.
Deskripsi aturan
Pertimbangkan jenis dasar yang secara eksplisit mengimplementasikan metode antarmuka publik. Jenis yang berasal dari jenis dasar hanya dapat mengakses metode antarmuka yang diwariskan melalui referensi ke instans saat ini (this
dalam C#) yang ditransmisikan ke antarmuka. Jika jenis turunan mengisi ulang (secara eksplisit) metode antarmuka yang diwariskan, implementasi dasar tidak dapat lagi diakses. Panggilan melalui referensi instans saat ini akan memanggil implementasi turunan; ini menyebabkan rekursi dan luapan tumpukan akhirnya.
Aturan ini tidak melaporkan pelanggaran untuk implementasi eksplisit tentang System.IDisposable.Dispose kapan metode atau Close()
yang terlihat System.IDisposable.Dispose(Boolean)
secara eksternal disediakan.
Cara memperbaiki pelanggaran
Untuk memperbaiki pelanggaran aturan ini, terapkan metode baru yang mengekspos fungsionalitas yang sama dan terlihat oleh jenis turunan atau perubahan pada implementasi yang tidak ada. Jika perubahan yang melanggar dapat diterima, alternatifnya adalah membuat jenis disegel.
Kapan harus menekan peringatan
Aman untuk menekan peringatan dari aturan ini jika metode yang terlihat secara eksternal disediakan yang memiliki fungsionalitas yang sama tetapi nama yang berbeda dari metode yang diimplementasikan secara eksplisit.
Menyembunyikan peringatan
Jika Anda hanya ingin menyembunyikan satu pelanggaran, tambahkan arahan praprosedur ke file sumber Anda untuk dinonaktifkan lalu aktifkan kembali aturannya.
#pragma warning disable CA1033
// The code that's violating the rule is on this line.
#pragma warning restore CA1033
Untuk menonaktifkan aturan untuk file, folder, atau proyek, atur tingkat keparahannya ke none
dalam file konfigurasi.
[*.{cs,vb}]
dotnet_diagnostic.CA1033.severity = none
Untuk informasi selengkapnya, lihat Cara menyembunyikan peringatan analisis kode.
Contoh
Contoh berikut menunjukkan jenis, ViolatingBase
, yang melanggar aturan dan jenis, FixedBase
, yang menunjukkan perbaikan untuk pelanggaran.
public interface ITest
{
void SomeMethod();
}
public class ViolatingBase : ITest
{
void ITest.SomeMethod()
{
// ...
}
}
public class FixedBase : ITest
{
void ITest.SomeMethod()
{
SomeMethod();
}
protected void SomeMethod()
{
// ...
}
}
sealed public class Derived : FixedBase, ITest
{
public void SomeMethod()
{
// The following would cause recursion and a stack overflow.
// ((ITest)this).SomeMethod();
// The following is unavailable if derived from ViolatingBase.
base.SomeMethod();
}
}