Mengatasi kesalahan dan peringatan untuk new ekspresi dan pembuatan objek

Artikel ini membahas kesalahan dan peringatan pengkompilasi berikut:

  • CS0144: Tidak dapat membuat instans jenis abstrak atau antarmuka 'jenis'
  • CS0712: Tidak dapat membuat instans kelas statis 'jenis'
  • CS1526: Ekspresi baru memerlukan daftar argumen atau (), [], atau {} setelah jenis
  • CS8181: 'new' tidak dapat digunakan dengan tipe tuple. Gunakan ekspresi literal tuple sebagai gantinya.
  • CS8386: Pembuatan objek tidak valid
  • CS8752: Tipe 'type' tidak dapat digunakan sebagai tipe target new()
  • CS8753: Penggunaan new() tidak valid dalam konteks ini
  • CS8754: Tidak ada jenis target untuk 'ekspresi'

Jenis yang tidak dapat diinstansiasi

  • CS0144: Tidak dapat membuat instans jenis abstrak atau antarmuka 'jenis'
  • CS0712: Tidak dapat membuat instans kelas statis 'jenis'

Operator new hanya dapat membuat instans jenis konkret dan non-statis. Bahasa ini melarang membuat instans kelas abstrak, antarmuka, dan kelas statis karena jenis ini tidak lengkap atau tidak dirancang untuk memiliki instans.

  • Buat kelas konkret yang berasal dari kelas abstrak, atau buat kelas yang mengimplementasikan antarmuka, lalu buat jenis beton itu (CS0144). Anda tidak dapat menggunakan new langsung pada abstract kelas atau karena interface tidak menyediakan implementasi lengkap. Jika Anda memiliki tipe tersebut, Anda juga dapat menghapus pengubah abstract agar kelas dapat diinstansiasi secara langsung.
  • new Hapus ekspresi dan akses anggota kelas statis langsung melalui nama kelas (CS0712). Kelas statis hanya ada untuk mengelompokkan anggota statis dan tidak dapat dibuat instans. Jika Anda memerlukan instans, hapus pengubah static dari deklarasi kelas.

Untuk informasi selengkapnya, lihat kelas abstrak, antarmuka, dan Kelas Statis dan Anggota Kelas Statis.

new kesalahan sintaks ekspresi

  • CS1526: Ekspresi baru memerlukan daftar argumen atau (), [], atau {} setelah jenis
  • CS8181: 'new' tidak dapat digunakan dengan tipe tuple. Gunakan ekspresi literal tuple sebagai gantinya.
  • CS8386: Pembuatan objek tidak valid

Kesalahan ini terjadi ketika sintaks new ekspresi salah bentuk atau saat Anda menggunakan new dengan jenis yang memerlukan sintaks pembuatan yang berbeda.

  • Tambahkan daftar argumen (), dimensi array [], atau penginisialisasi {} setelah nama jenis dalam ekspresi new (CS1526). Operator new memerlukan salah satu dari ini untuk menunjukkan bagaimana objek dibangun. Misalnya, tulis new MyClass() alih-alih new MyClass.
  • Ganti new (int, string)(...) dengan ekspresi harfiah tuple seperti (1, "hello") (CS8181). Tipe tuple menggunakan sintaks literal khusus alih-alih operator new. Untuk membuat tuple, gunakan nilai dalam tanda kurung secara langsung: (int X, string Y) point = (1, "hello");.
  • Pastikan ekspresi new menargetkan tipe yang dapat dikonstruksi dan valid (CS8386). Kesalahan ini terjadi ketika pengkompilasi tidak dapat menentukan pembuatan objek yang valid dari sintaks. Verifikasi bahwa Anda menggunakan nama jenis yang mendukung konstruksi, dan bahwa ekspresi selesai secara sintis.

Untuk informasi selengkapnya, lihat operator baru dan jenis Tuple.

Ekspresi berjenis new target

  • CS8752: Tipe 'type' tidak dapat digunakan sebagai tipe target dari new()
  • CS8753: Penggunaan new() tidak valid dalam konteks ini
  • CS8754: Tidak ada jenis target untuk 'ekspresi'

Ekspresi yang diketik target new (diperkenalkan dalam C# 9) memungkinkan Anda menghilangkan nama jenis ketika pengompilasi dapat menyimpulkannya dari konteks, seperti dalam MyClass x = new();. Kesalahan ini terjadi ketika pengkompilasi tidak dapat menentukan jenis target yang valid atau ketika jenis yang disimpulkan tidak dapat dibangun.

  • Gunakan nama tipe eksplisit alih-alih new() bertipe target saat tipe target berupa antarmuka, kelas abstrak, kelas statis, atau tipe lain yang tidak dapat dikonstruksi (CS8752). new() yang ditentukan oleh tipe target menyimpulkan tipe dari ruas kiri, tetapi tipe yang disimpulkan harus berupa tipe konkret yang dapat diinstansiasi. Tulis new ConcreteType() secara lengkap sebagai gantinya.
  • Pindahkan new() ekspresi ke konteks di mana jenis target tersedia (CS8753). Jenis target new hanya valid dalam konteks di mana pengkompilasi dapat menentukan jenis, seperti deklarasi variabel dengan jenis eksplisit, ekspresi penugasan, pernyataan pengembalian dengan jenis pengembalian yang diketahui, atau posisi argumen dengan jenis parameter yang diketahui. Anda tidak dapat menggunakan new() dalam konteks seperti var x = new(); di mana tidak ada jenis target.
  • Berikan jenis eksplisit untuk new ekspresi ketika tidak ada jenis target yang dapat disimpulkan (CS8754). Kesalahan ini terjadi ketika Anda menggunakan new() dalam posisi di mana pengkompilasi tidak memiliki cara untuk menentukan jenis apa yang akan dibangun. Ganti new() dengan new ExplicitType(), atau deklarasikan variabel dengan jenis eksplisit daripada var.

Untuk informasi selengkapnya, lihat ekspresi `new` bertipe target.