Peringatan "Gunakan kata kunci baru jika memang sengaja menyembunyikan"

101

Saya memiliki peringatan di bagian bawah layar saya:

Peringatan 1 'WindowsFormsApplication2.EventControlDataSet.Events' menyembunyikan anggota yang diwariskan 'System.ComponentModel.MarshalByValueComponent.Events'. Gunakan kata kunci baru jika memang dimaksudkan untuk menyembunyikan. C: \ Users \ myComputer \ Desktop \ Event Control \ WindowsFormsApplication2 \ EventControlDataSet.Designer.cs 112 32 eventControl

Jika saya mengklik dua kali di atasnya, itu muncul dengan:

public EventsDataTable Events {
    get {
        return this.tableEvents;
    }

Adakah yang bisa memberi tahu saya bagaimana menyingkirkan ini?

tony b
sumber

Jawaban:

144

Kelas Anda memiliki kelas dasar, dan kelas dasar ini juga memiliki properti (yang bukan virtual atau abstrak) yang disebut Peristiwa yang diganti oleh kelas Anda. Jika Anda berniat untuk menggantinya, letakkan kata kunci "baru" setelah pengubah publik. MISALNYA

public new EventsDataTable Events
{
  ..
}

Jika Anda tidak ingin menimpanya, ubah nama properti Anda menjadi nama lain.

selamat
sumber
23
Berikut ini tautan untuk siapa saja yang ingin mengetahui perbedaan antara new dan override.
starsplusplus
Kata new kunci akan menghilangkan kesalahan kompilasi, tetapi dapat menyebabkan perilaku yang tidak diinginkan lainnya. Saya pikir Anda harus menambahkan peringatan pada jawaban Anda. Itu akan membantu untuk memahami konsekuensi dari penambahan new.
ahong
13

@wdavo benar. Hal yang sama juga berlaku untuk fungsi.

Jika Anda mengganti fungsi dasar, seperti Update, maka di subclass Anda, Anda perlu:

new void Update()
{
  //do stufff
}

Tanpa new di awal decleration fungsi Anda akan mendapatkan flag peringatan.

Agresor
sumber
6

Pada kode di bawah ini, Class Amengimplementasikan antarmuka IShowdan mengimplementasikan metodenya ShowData. Class Bmewarisi Class A. Untuk menggunakan ShowDatametode di Class B, kita harus menggunakan kata kunci newdalam ShowDatametode untuk menyembunyikan Class Ametode kelas dasar dan menggunakan overridekata kunci untuk memperluas metode.

interface IShow
{
    protected void ShowData();
}

class A : IShow
{
    protected void ShowData()
    {
        Console.WriteLine("This is Class A");
    }
}

class B : A
{
    protected new void ShowData()
    {
        Console.WriteLine("This is Class B");
    }
}
Joee
sumber
3
Tidak ada overridedalam contoh Anda dari penjelasan Anda dan overridetidak diperlukan.
Etienne Faucher
Saya pikir teladan Anda berada di jalur yang benar, tetapi tidak lengkap. Juga penjelasan Anda tidak jelas. Bisakah Anda mengedit jawaban Anda menjadi sesuatu yang lebih mirip dotnetfiddle.net/Iw0OzB ? Jika tidak, saya mungkin akan memposting biola saya sebagai jawaban lain
ahong
0

Fungsi induk membutuhkan virtualkata kunci, dan fungsi anak membutuhkan overridekata kunci di depan definisi fungsi.

James L.
sumber