Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
| Properti | Nilai |
|---|---|
| ID Aturan | CA1033 |
| Judul | Metode antarmuka harus dapat dipanggil oleh tipe turunan |
| Kategori | Desain |
| Perbaikan bersifat merusak atau tidak merusak | Tidak terputus |
| Diaktifkan secara default di .NET 10 | Tidak |
| Bahasa yang berlaku | C# dan Visual Basic |
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 yang diturunkan; ini menyebabkan rekursi dan akhirnya terjadi stack overflow.
Aturan ini tidak melaporkan pelanggaran untuk implementasi eksplisit dari System.IDisposable.Dispose ketika metode Close() atau System.IDisposable.Dispose(Boolean) yang terlihat secara eksternal disediakan.
Cara memperbaiki pelanggaran
Untuk memperbaiki pelanggaran aturan ini, terapkan metode baru yang mengekspos fungsionalitas yang sama dan dapat diakses oleh tipe turunan atau berubah ke implementasi yang tidak eksplisit. Jika perubahan yang melanggar dapat diterima, alternatifnya adalah membuat jenis disegel.
Kapan harus menekan peringatan
Aman untuk mengabaikan peringatan dari aturan ini jika ada metode yang terekspose secara eksternal yang memiliki fungsi 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();
}
}