Bagikan melalui


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 8 Tidak

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 System.IDisposable.Dispose(Boolean) yang terlihat Close() 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();
    }
}

Baca juga