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.
Tujuan peringatan nullable adalah untuk meminimalkan kemungkinan aplikasi Anda melempar saat System.NullReferenceException dijalankan. Untuk mencapai tujuan ini, pengkompilasi menggunakan analisis statis dan mengeluarkan peringatan ketika kode Anda memiliki konstruksi yang mungkin menyebabkan pengecualian referensi null. Anda memberikan informasi kepada kompilator untuk analisis statisnya dengan menerapkan anotasi dan atribut jenis. Anotasi dan atribut ini menjelaskan kemungkinan menjadi null dari argumen, parameter, dan anggota tipe Anda. Dalam artikel ini, Anda mempelajari berbagai teknik untuk mengatasi peringatan null yang dihasilkan kompilator dari analisis statisnya. Teknik yang dijelaskan di sini adalah untuk kode C# umum. Pelajari cara bekerja dengan jenis referensi yang dapat diubah ke null dan inti Entity Framework dalam Bekerja dengan jenis referensi yang dapat diubah ke null.
Jenis referensi nullable, termasuk operator ?
dan !
hanya diizinkan ketika konteks nullable diatur ke enable
atau annotations
. Anda dapat mengatur konteks nullable menggunakan opsi pengkompilasi Nullable
dalam file proyek Anda, atau menggunakan pragma #nullable
dalam kode sumber Anda.
Artikel ini membahas peringatan pengkompilasi berikut:
- CS8597 - Nilai yang dilemparkan mungkin bernilai null.
- CS8598 - Operator supresi tidak diizinkan dalam konteks ini
- CS8600 - Mengonversi literal null atau kemungkinan nilai null ke tipe yang tidak dapat bernilai null.
- CS8601 - Kemungkinan penetapan referensi null.
- CS8602 - Dereferensi pada referensi yang mungkin null.
- CS8603 - Kemungkinan pengembalian referensi null.
- CS8604 - Kemungkinan argumen referensi null untuk parameter.
- CS8605 - Membongkar nilai yang mungkin null.
-
CS8607 - Nilai null yang mungkin tidak digunakan untuk jenis yang ditandai dengan
[NotNull]
atau[DisallowNull]
- CS8608 - Nullability jenis referensi tidak sesuai dengan anggota yang ditimpa.
- CS8609 - Nullability jenis referensi pada jenis pengembalian tidak cocok dengan anggota yang di-override.
- CS8610 - Nullability tipe referensi dalam parameter tipe tidak sesuai dengan anggota yang dioverride.
- CS8611 - Ketidaknullan jenis referensi pada parameter tipe tidak sesuai dengan deklarasi metode parsial.
- CS8612 - Ketidaknulan tipe referensi dalam tipe tidak sesuai dengan anggota yang diimplementasikan secara implisit.
- CS8613 - Nullability tipe referensi dalam tipe pengembalian tidak sesuai dengan anggota yang diimplementasikan secara implisit.
- CS8614 - Nullabilitas tipe referensi pada tipe parameter tidak cocok dengan anggota yang diimplementasikan secara implisit.
- CS8615 - Nullability jenis referensi dalam jenis tidak cocok dengan anggota yang diimplementasikan.
- CS8616 - Ketidakbolehan null jenis referensi dalam jenis pengembalian tidak cocok dengan anggota yang diimplementasikan.
- CS8617 - Nullability tipe referensi dalam jenis parameter tidak cocok dengan member yang diterapkan.
- CS8618 - Variabel yang tidak dapat bernilai null harus memiliki nilai tidak null saat meninggalkan konstruktor. Pertimbangkan untuk mendeklarasikannya sebagai dapat bernilai null.
- CS8619 - Kegunaan null jenis referensi dalam nilai tidak sesuai dengan jenis target.
- CS8620 - Argumen tidak dapat digunakan untuk parameter karena perbedaan ketidakmampuan null pada jenis referensi.
- CS8621 - Nullability jenis referensi dalam jenis pengembalian tidak cocok dengan delegasi target (mungkin karena atribut nullability).
- CS8622 - Nullability tipe referensi pada tipe parameter tidak sesuai dengan delegasi target, yang mungkin disebabkan oleh atribut nullability.
-
CS8623 - Aplikasi eksplisit
System.Runtime.CompilerServices.NullableAttribute
tidak diizinkan. - CS8624 - Argumen tidak dapat digunakan sebagai output karena perbedaan dalam kemampuan null tipe referensi.
- CS8625 - Tidak dapat mengonversi literal null ke tipe referensi yang tidak dapat diubah ke null.
- CS8628 - Tidak dapat menggunakan jenis referensi nullable dalam pembuatan objek.
- CS8629 - Jenis nilai nullable mungkin null.
- CS8631 - Tipe ini tidak dapat digunakan sebagai parameter tipe dalam tipe atau metode generik. Nullability dari argumen tipe tidak sesuai dengan tipe batasan.
-
CS8632 - Anotasi untuk jenis referensi nullable hanya boleh digunakan dalam kode dalam konteks anotasi
#nullable
. - CS8633 - Kekurangan null dalam batasan untuk parameter tipe metode tidak sesuai dengan batasan untuk parameter tipe metode antarmuka. Pertimbangkan untuk menggunakan implementasi antarmuka secara eksplisit sebagai gantinya.
- CS8634 - Jenis tidak dapat digunakan sebagai parameter jenis dalam jenis atau metode generik. Kemampuan null tipe argumen tidak cocok dengan batasan 'kelas'.
- opsi CS8636 - Tidak Valid untuk
/nullable
; harusdisable
,enable
,warnings
atauannotations
-
CS8637 -
enable
yang Diharapkan,disable
, ataurestore
- CS8639 - Operator typeof tidak dapat digunakan pada jenis referensi nullable
- CS8643 - Nullability tipe referensi dalam spesifikasi antarmuka eksplisit tidak cocok dengan antarmuka yang diterapkan oleh tipe.
- CS8644 - Tipe tidak menerapkan anggota antarmuka. Ke-nolan tipe referensi dalam antarmuka yang diimplementasikan oleh tipe dasar tidak sesuai.
- CS8645 - Anggota sudah tercantum dalam daftar antarmuka pada tipe dengan tingkat nullability jenis referensi yang berbeda.
- CS8655 - Ekspresi pengalihan tidak menangani beberapa input null (tidak lengkap).
- CS8667 - Deklarasi metode parsial memiliki nullability yang tidak konsisten dalam batasan untuk parameter jenis.
- CS8670 - Penginisialisasi objek atau koleksi secara implisit mendereferensikan anggota yang mungkin null.
- CS8714 - Tipe ini tidak dapat digunakan sebagai parameter tipe dalam tipe atau metode generik. Ketidaknullan argumen tipe tidak sesuai dengan batasan 'notnull'.
- Parameter CS8762 - harus memiliki nilai non-null saat keluar.
-
CS8763 - Metode yang ditandai
[DoesNotReturn]
tidak boleh mengembalikan. - CS8764 - Nullability jenis pengembalian tidak sesuai dengan anggota yang di-override (mungkin karena atribut nullability).
- CS8765 - Nullability jenis parameter tidak sesuai dengan anggota yang di-override (mungkin karena atribut nullability).
- CS8766 - Nullability dari tipe referensi dalam tipe pengembalian tidak sesuai dengan anggota yang diimplementasikan secara implisit (mungkin karena atribut nullability).
- CS8767 - Ketidakcocokan nullability tipe referensi pada tipe parameter dengan anggota yang diimplementasikan secara implisit (mungkin disebabkan oleh atribut ketidaknullan).
- CS8768 - Kereferensian null pada tipe rujukan dalam tipe pengembalian tidak sesuai dengan anggota yang diimplementasikan (mungkin karena atribut nullability).
- CS8769 - Nullability jenis referensi dalam tipe parameter tidak sesuai dengan anggota yang diimplementasikan (kemungkinan disebabkan oleh atribut nullability).
-
CS8770 - Metode tidak memiliki
[DoesNotReturn]
anotasi agar sesuai dengan anggota yang diimplementasikan atau ditimpa. - Anggota CS8774 - harus memiliki nilai non-null saat keluar.
- Anggota CS8776 - tidak dapat digunakan dalam atribut ini.
- CS8775 - Elemen harus memiliki nilai non-null saat keluar.
- Parameter CS8777 - harus memiliki nilai non-null saat keluar.
- CS8819 - Kemungkinan nilai null dari jenis referensi dalam jenis pengembalian tidak sesuai dengan deklarasi metode parsial.
- Parameter CS8824 - Parameter harus memiliki nilai yang tidak null saat keluar karena parameter bersifat non-null.
- CS8825 - Nilai kembali mesti tidak bernilai null karena parameter tidak bernilai null.
- CS8847 - Ekspresi pengalihan tidak menangani beberapa input null (tidak lengkap). Namun, pola dengan klausa 'kapan' mungkin berhasil mencocokkan nilai ini.
Nota
Analisis statis tidak selalu dapat menyimpulkan dalam urutan apa, dalam skenario tertentu, metode diakses, dan apakah metode berhasil diselesaikan tanpa melemparkan pengecualian. Jebakan yang diketahui tersebut dijelaskan dengan baik di bagian jebakan yang diketahui.
Anda mengatasi hampir semua peringatan menggunakan salah satu dari lima teknik:
- Mengonfigurasi konteks nullable.
- Menambahkan pemeriksaan null yang diperlukan.
- Menambahkan atau menghapus anotasi
?
atau!
nullable. - Menambahkan atribut yang menjelaskan semantik null.
- Menginisialisasi variabel dengan benar.
Jika Anda baru menggunakan jenis referensi nullable, gambaran umum jenis referensi nullable menyediakan latar belakang tentang jenis referensi nullable apa yang dipecahkan dan cara kerjanya untuk memberikan peringatan terhadap kemungkinan kesalahan dalam kode Anda. Anda juga dapat memeriksa panduan mengenai migrasi ke referensi tipe nullable untuk mempelajari selengkapnya tentang mengaktifkan tipe referensi nullable dalam proyek yang ada.
Mengonfigurasi konteks nullable
Peringatan berikut menunjukkan bahwa Anda belum mengatur konteks nullable dengan benar:
-
CS8632 - Anotasi untuk jenis referensi nullable hanya boleh digunakan pada kode dalam konteks anotasi
#nullable
. - opsi CS8636 - Tidak Valid untuk
/nullable
; harusdisable
,enable
,warnings
atauannotations
-
CS8637 - diharapkan
enable
,disable
, ataurestore
Sintaks anotasi yang salah
Kesalahan dan peringatan ini menunjukkan bahwa penggunaan anotasi !
atau ?
salah.
- CS8598 - Operator supresi tidak diizinkan dalam konteks ini
-
CS8623 - Aplikasi eksplisit
System.Runtime.CompilerServices.NullableAttribute
tidak diizinkan. - CS8628 - Tidak dapat menggunakan tipe referensi null dalam pembuatan objek.
- CS8639 - Operator typeof tidak dapat digunakan pada tipe referensi nullable
Anotasi ?
dalam deklarasi menunjukkan bahwa variabel mungkin null. Ini tidak mengindikasikan tipe runtime yang berbeda. Kedua deklarasi berikut adalah jenis runtime yang sama:
string s1 = "a string";
string? s2 = "another string";
?
adalah petunjuk untuk pengkompilasi pada harapan untuk nilai null.
Anotasi !
pada ekspresi menunjukkan bahwa Anda memahami bahwa ekspresi tersebut aman dan sebaiknya diasumsikan sebagai tidak null.
- Anda harus menggunakan anotasi ini, bukan System.Runtime.CompilerServices.NullableAttribute dalam kode Anda.
- Karena
?
adalah anotasi, bukan jenis, Anda tidak dapat menggunakannya dengan ekspresitypeof
, ataunew
. - Operator
!
tidak dapat diterapkan ke ekspresi variabel atau grup metode. - Operator
!
tidak dapat diterapkan di sebelah kiri operator akses anggota, sepertiobj.Field!.Method()
.
Kemungkinan akses nilai dari objek null
Set peringatan ini memperingatkan Anda bahwa Anda mendereferensiasi variabel yang keadaan null-nya adalah mungkin null. Peringatan ini adalah:
- CS8602 - Dereferensi referensi yang mungkin null.
- CS8670 - Penginisialisasi objek atau koleksi secara implisit mendereferensikan anggota yang mungkin null.
Kode berikut menunjukkan satu contoh dari setiap peringatan sebelumnya:
class Container
{
public List<string>? States { get; set; }
}
internal void PossibleDereferenceNullExamples(string? message)
{
Console.WriteLine(message.Length); // CS8602
var c = new Container { States = { "Red", "Yellow", "Green" } }; // CS8670
}
Dalam contoh sebelumnya, peringatan adalah karena Container
, c
, mungkin memiliki nilai null untuk properti States
. Menambahkan status baru pada koleksi yang mungkin kosong menyebabkan peringatan.
Untuk menghapus peringatan ini, Anda perlu menambahkan kode untuk mengubah status-null variabel tersebut menjadi tidak-null sebelum melakukan dereferensi padanya. Peringatan penginisialisasi koleksi bisa lebih sulit ditemukan. Pengkompilasi mendeteksi bahwa koleksi mungkin null ketika penginisialisasi menambahkan elemen ke dalamnya.
Dalam banyak kasus, Anda dapat memperbaiki peringatan ini dengan memeriksa bahwa variabel tidak null sebelum mengakses nilainya. Pertimbangkan contoh berikut yang menambahkan pemeriksaan null sebelum mendereferensikan parameter message
:
void WriteMessageLength(string? message)
{
if (message is not null)
{
Console.WriteLine(message.Length);
}
}
Contoh berikut menginisialisasi penyimpanan cadangan untuk States
dan menghapus set
aksesor. Pengguna kelas dapat memodifikasi isi dari koleksi, dan penyimpanan untuk koleksi tidak pernah null
:
class Container
{
public List<string> States { get; } = new();
}
Kasus lain di mana Anda mendapatkan peringatan ini mungkin positif palsu. Anda mungkin memiliki metode utilitas pribadi yang menguji keberadaan null. Kompilator tidak tahu bahwa metode menyediakan pemeriksaan null. Pertimbangkan contoh berikut yang menggunakan metode utilitas privat, IsNotNull
:
public void WriteMessage(string? message)
{
if (IsNotNull(message))
Console.WriteLine(message.Length);
}
Pengkompilasi memperingatkan bahwa Anda mungkin mendereferensiasi null ketika Anda menulis properti message.Length
karena analisis statisnya menentukan bahwa message
mungkin null
. Anda tahu bahwa IsNotNull
memberikan pemeriksaan null, dan ketika mengembalikan true
, status null dari message
harus tidak-null. Anda harus memberitahu kompilator fakta tersebut. Salah satu caranya adalah dengan menggunakan operator pengampunan null, !
. Anda dapat mengubah pernyataan WriteLine
agar cocok dengan kode berikut:
Console.WriteLine(message!.Length);
Operator pengampunan null membuat ekspresi tidak null meskipun mungkin-null tanpa penerapan !
. Dalam contoh ini, solusi yang lebih baik adalah menambahkan atribut ke tanda tangan IsNotNull
:
private static bool IsNotNull([NotNullWhen(true)] object? obj) => obj != null;
System.Diagnostics.CodeAnalysis.NotNullWhenAttribute menginformasikan kompilator bahwa argumen yang digunakan untuk parameter obj
adalah tidak nullketika metode mengembalikan true
. Ketika metode mengembalikan false
, argumen memiliki status null yang sama dengan sebelum metode dipanggil.
Kiat
Ada sekumpulan atribut kaya yang dapat Anda gunakan untuk menjelaskan bagaimana metode dan properti Anda memengaruhi status null. Anda dapat mempelajarinya di artikel referensi bahasa pemrograman tentang atribut analisis statis Nullable.
Memperbaiki peringatan untuk dereferensi variabel mungkin-null dapat dilakukan dengan menggunakan salah satu dari tiga teknik.
- Tambahkan pemeriksaan null yang belum ada.
- Tambahkan atribut analisis null pada API untuk memengaruhi analisis statis status null kompilator. Atribut ini menginformasikan kompilator ketika nilai atau argumen kembali harus mungkin-null atau tidak-null setelah memanggil metode.
- Terapkan operator null forgiving
!
pada ekspresi yang memastikan status menjadi tidak null.
Kemungkinan null ditetapkan ke referensi yang tidak boleh null.
Set peringatan ini memberitahukan Anda bahwa Anda menetapkan variabel yang jenisnya tidak dapat menerima nilai null ke ekspresi yang status null-nya mungkin-null. Peringatan ini adalah:
- C8597 - Nilai yang dilemparkan mungkin bernilai null.
- CS8600 - Mengonversi nilai null atau kemungkinan nilai null ke jenis yang tidak dapat bernilai null.
- CS8601 - Kemungkinan penetapan referensi null.
- CS8603 - Kemungkinan mengembalikan referensi yang null.
- CS8604 - Kemungkinan argumen referensi null untuk parameter.
- CS8605 - Membuka kotak mungkin nilai null.
- CS8625 - Tidak dapat mengonversi literal null ke tipe referensi non-nullable.
- CS8629 - Jenis nilai nullable mungkin bernilai null.
Kompilator mengeluarkan peringatan ini ketika Anda mencoba menetapkan ekspresi yang mungkin null ke variabel yang tidak dapat diubah ke null. Contohnya:
string? TryGetMessage(int id) => "";
string msg = TryGetMessage(42); // Possible null assignment.
Peringatan yang berbeda memberikan detail tentang kode, seperti penugasan, penugasan unboxing, pernyataan pengembalian, argumen untuk metode, dan ekspresi throw.
Anda dapat mengambil salah satu dari tiga tindakan untuk mengatasi peringatan ini. Salah satunya adalah menambahkan anotasi ?
untuk menjadikan variabel sebagai jenis referensi yang dapat diubah ke null. Perubahan itu dapat menyebabkan peringatan lain. Mengubah variabel dari referensi yang tidak dapat diubah ke null menjadi referensi yang dapat diubah ke null mengubah default status nullnya dari tidak-null menjadi mungkin-null. Analisis statis kompilator menemukan instans di mana Anda mendereferensikan variabel yang mungkin-null.
Tindakan lain menginstruksikan kompilator bahwa sisi kanan penugasan variabel adalah non-null. Ekspresi di sisi kanan dapat menjalani pemeriksaan null sebelum pengalokasian, seperti yang ditunjukkan dalam contoh berikut:
string notNullMsg = TryGetMessage(42) ?? "Unknown message id: 42";
Contoh sebelumnya menunjukkan penetapan nilai pengembalian metode. Anda membuat anotasi metode (atau properti) untuk menunjukkan kapan metode mengembalikan nilai bukan null.
System.Diagnostics.CodeAnalysis.NotNullIfNotNullAttribute sering menentukan bahwa nilai yang dikembalikan tidak-null ketika argumen input tidak-null. Alternatif lain adalah menambahkan operator pengampunan null, !
ke sisi kanan:
string msg = TryGetMessage(42)!;
Memperbaiki peringatan untuk menetapkan ekspresi mungkin null ke variabel tidak-null melibatkan salah satu dari empat teknik:
- Ubah sisi kiri penugasan menjadi tipe yang dapat bernilai null. Tindakan ini dapat memperkenalkan peringatan baru saat Anda mendereferensikan variabel tersebut.
- Berikan pemeriksaan null sebelum penugasan.
- Beri anotasi pada API yang menghasilkan sisi kanan penugasan.
- Tambahkan operator 'null forgiving' ke sisi kanan pernyataan penugasan.
Referensi yang tidak dapat diubah ke null tidak diinisialisasi
Kumpulan peringatan ini memperingatkan Anda bahwa Anda menetapkan variabel yang jenisnya tidak dapat bernilai null ke ekspresi yang status null-nyamungkin null. Peringatan ini adalah:
- CS8618 - Variabel yang non-nullable harus memiliki nilai non-null saat keluar dari konstruktor. Pertimbangkan untuk mendeklarasikannya sebagai nullable.
- Parameter CS8762 - harus memiliki nilai non-null saat keluar.
Pertimbangkan kelas berikut sebagai contoh:
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
Baik FirstName
maupun LastName
tidak dijamin diinisialisasi. Jika kode ini baru, pertimbangkan untuk mengubah antarmuka publik. Contoh sebelumnya dapat diperbarui sebagai berikut:
public class Person
{
public Person(string first, string last)
{
FirstName = first;
LastName = last;
}
public string FirstName { get; set; }
public string LastName { get; set; }
}
Jika Anda memerlukan pembuatan objek Person
sebelum mengatur nama, Anda dapat menginisialisasi properti menggunakan nilai tidak-null default:
public class Person
{
public string FirstName { get; set; } = string.Empty;
public string LastName { get; set; } = string.Empty;
}
Alternatif lain adalah mengubah anggota tersebut menjadi tipe referensi yang dapat bernilai null. Kelas Person
dapat didefinisikan sebagai berikut jika null
harus diizinkan untuk nama:
public class Person
{
public string? FirstName { get; set; }
public string? LastName { get; set; }
}
Kode yang ada terkadang memerlukan perubahan lain untuk menginformasikan pengkompilasi tentang semantik null untuk anggota tersebut. Ini mungkin memiliki beberapa konstruktor, dan kelas Anda memiliki metode pembantu privat yang menginisialisasi satu atau beberapa anggota. Anda dapat memindahkan kode inisialisasi ke dalam satu konstruktor dan memastikan bahwa semua konstruktor memanggil konstruktor tersebut dengan kode inisialisasi yang sama. Atau, Anda dapat menggunakan atribut System.Diagnostics.CodeAnalysis.MemberNotNullAttribute dan System.Diagnostics.CodeAnalysis.MemberNotNullWhenAttribute. Atribut ini memberi tahu pengkompilasi bahwa anggota tidak null setelah metode selesai. Kode berikut menunjukkan contoh masing-masing. Kelas Person
menggunakan konstruktor umum yang dipanggil oleh semua konstruktor lain. Kelas Student
ini memiliki metode pembantu yang beranotasi dengan atribut System.Diagnostics.CodeAnalysis.MemberNotNullAttribute:
using System.Diagnostics.CodeAnalysis;
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public Person(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
}
public Person() : this("John", "Doe") { }
}
public class Student : Person
{
public string Major { get; set; }
public Student(string firstName, string lastName, string major)
: base(firstName, lastName)
{
SetMajor(major);
}
public Student(string firstName, string lastName) :
base(firstName, lastName)
{
SetMajor();
}
public Student()
{
SetMajor();
}
[MemberNotNull(nameof(Major))]
private void SetMajor(string? major = default)
{
Major = major ?? "Undeclared";
}
}
Terakhir, Anda dapat menggunakan operator pengampunan null untuk menunjukkan bahwa anggota diinisialisasi di kode lain. Untuk contoh lain, pertimbangkan kelas berikut yang mewakili model Entity Framework Core:
public class TodoItem
{
public long Id { get; set; }
public string? Name { get; set; }
public bool IsComplete { get; set; }
}
public class TodoContext : DbContext
{
public TodoContext(DbContextOptions<TodoContext> options)
: base(options)
{
}
public DbSet<TodoItem> TodoItems { get; set; } = null!;
}
Properti DbSet
diinisialisasi ke null!
. Itu memberi tahu kompilator bahwa properti diatur ke nilai tidak null. Bahkan, DbContext
dasar bertanggung jawab atas inisialisasi himpunan. Analisis statis kompilator tidak mendeteksi hal tersebut. Untuk informasi selengkapnya tentang bekerja dengan jenis referensi yang dapat diubah ke null dan Entity Framework Core, lihat artikel tentang Bekerja dengan Jenis Referensi yang Dapat Diubah ke Null di EF Core.
Memperbaiki peringatan untuk tidak menginisialisasi anggota yang tidak dapat diubah ke null melibatkan salah satu dari empat teknik:
- Ubah konstruktor atau penginisialisasi bidang untuk memastikan semua anggota yang tidak dapat diubah ke null diinisialisasi.
- Ubah satu atau beberapa anggota menjadi tipe yang dapat bernilai null.
- Anotasi metode pembantu apa pun untuk menunjukkan anggota mana yang ditetapkan.
- Tambahkan penginisialisasi ke
null!
untuk menunjukkan bahwa anggota diinisialisasi dalam kode lain.
Ketidakcocokan dalam deklarasi ketidaknullan
Banyak peringatan menunjukkan ketidakcocokan nullability antara tanda tangan untuk metode, delegasi, atau parameter jenis.
- CS8608 - Ketidaknullan tipe referensi dalam jenis tidak sesuai dengan anggota yang diganti.
- CS8609 - Nullability tipe referensi pada tipe pengembalian tidak sesuai dengan anggota yang di-override.
- CS8610 - Sifat nullable dari tipe referensi pada parameter jenis tidak sesuai dengan anggota yang ditimpa.
- CS8611 - Nullability tipe referensi dalam parameter tipe tidak sesuai dengan deklarasi metode parsial.
- CS8612 - Kemungkinan nullitas dari tipe referensi tidak sesuai dengan anggota yang diimplementasikan secara implisit.
- CS8613 - Nullabilitas tipe referensi dalam tipe pengembalian tidak cocok dengan anggota yang diimplementasikan secara implisit.
- CS8614 - Keternulian tipe referensi dalam parameter tidak sesuai dengan anggota yang diimplementasikan secara implisit.
- CS8615 - Ketenolanan jenis referensi dalam tipe tidak sesuai dengan anggota yang diimplementasikan.
- CS8616 - Kemungkinan null dari tipe referensi dalam tipe pengembalian tidak sesuai dengan anggota yang diimplementasi.
- CS8617 - Nullability jenis referensi parameter tidak sesuai dengan anggota yang diimplementasikan.
- CS8619 - Ketidaknullan tipe referensi dalam nilai tidak sesuai dengan tipe target.
- CS8620 - Argumen tidak dapat digunakan untuk parameter karena perbedaan dalam sifat nullability tipe referensi.
- CS8621 - Nullability tipe referensi dalam tipe pengembalian tidak cocok dengan delegasi target (mungkin karena atribut kenull-an).
- CS8622 - Nullabilitas tipe referensi pada tipe parameter tidak sesuai dengan target delegasi (kemungkinan karena atribut kekosongan).
- CS8624 - Argumen tidak dapat digunakan sebagai output karena perbedaan dalam kekosongan null tipe referensi.
- CS8631 - Tipe tidak dapat digunakan sebagai parameter tipe dalam tipe atau metode generik. Ketidaknullan argumen tipe tidak cocok dengan batasan tipe.
- CS8633 - Nullability dalam batasan untuk parameter tipe metode tidak cocok dengan batasan untuk parameter tipe metode antarmuka. Pertimbangkan untuk menggunakan implementasi antarmuka eksplisit sebagai gantinya.
- CS8634 - Jenis tidak dapat digunakan sebagai parameter jenis dalam jenis atau metode generik. Kemampuan null tipe argumen tidak cocok dengan batasan 'kelas'.
- CS8643 - Kebolehnullan tipe referensi dalam penentu antarmuka eksplisit tidak cocok dengan antarmuka yang diterapkan oleh tipe tersebut.
- Tipe CS8644 - tidak menerapkan anggota antarmuka. Nullability jenis referensi dalam antarmuka yang diimplementasikan oleh jenis dasar tidak cocok.
- CS8645 - sudah tercantum dalam daftar antarmuka pada tipe dengan nullability referensi yang berbeda.
- CS8667 - Deklarasi metode parsial memiliki nullability yang tidak konsisten dalam batasan untuk parameter tipe.
- CS8714 - Jenis tidak dapat digunakan sebagai parameter tipe dalam tipe atau metode generik. Nullable dari argumen tipe tidak sesuai dengan batasan 'notnull'.
- CS8764 - Nullability tipe pengembalian tidak cocok dengan anggota yang dioverride (mungkin karena atribut nullability).
- CS8765 - Nullability tipe parameter tidak cocok dengan anggota yang di-override (mungkin karena atribut nullability).
- CS8766 - Nullability jenis referensi dalam jenis pengembalian tidak cocok dengan anggota yang diimplementasikan secara implisit (mungkin karena atribut nullability).
- CS8767 - Ketidaknullan tipe referensi dalam parameter tidak sesuai dengan anggota yang diimplementasikan secara implisit (mungkin karena atribut ketidaknullan).
- CS8768 - Ke-null-an jenis referensi dalam tipe pengembalian tidak cocok dengan anggota yang diimplementasikan (mungkin karena atribut ke-null-an).
- CS8769 - Nullabilitas jenis referensi pada tipe parameter tidak sesuai dengan anggota yang diimplementasikan (kemungkinan karena atribut-atribut nullability).
- CS8819 - Kenull-an tipe referensi dalam tipe pengembalian tidak cocok dengan deklarasi metode parsial.
Kode berikut menunjukkan CS8764:
public class B
{
public virtual string GetMessage(string id) => string.Empty;
}
public class D : B
{
public override string? GetMessage(string? id) => default;
}
Contoh sebelumnya menunjukkan metode virtual
di kelas dasar dan override
dengan kemampuan untuk dapat diubah ke null yang berbeda. Kelas dasar mengembalikan string yang tidak dapat diubah ke null, tetapi kelas turunan mengembalikan string yang dapat diubah ke null. Jika urutan string
dan string?
dibalik, itu diizinkan karena kelas turunan lebih membatasi. Demikian pula, deklarasi parameter harus cocok. Parameter dalam metode override dapat memperbolehkan null bahkan ketika kelas dasar tidak.
Situasi lain dapat menghasilkan peringatan ini. Anda memiliki ketidakcocokan dalam deklarasi metode antarmuka dan implementasi metode tersebut. Atau jenis delegasi dan ekspresi untuk delegasi tersebut berbeda. Parameter jenis dan argumen jenis berbeda dalam kemampuan menerima nilai null.
Untuk memperbaiki peringatan ini, perbarui deklarasi yang sesuai.
Kode tidak cocok dengan deklarasi atribut
Bagian sebelumnya membahas bagaimana Anda dapat menggunakan Atribut untuk analisis statis nullable untuk menginformasikan kompilator tentang semantik null kode Anda. Pengkompilasi memperingatkan Anda jika kode tidak mematuhi janji atribut tersebut:
-
CS8607 - Nilai null yang mungkin tidak boleh digunakan untuk jenis yang ditandai dengan
[NotNull]
atau[DisallowNull]
-
CS8763 - Sebuah metode yang ditandai
[DoesNotReturn]
seharusnya tidak mengembalikan nilai. -
Metode CS8770 - tidak memiliki
[DoesNotReturn]
anotasi agar sesuai dengan anggota yang diimplementasikan atau ditimpa. - Anggota CS8774 - harus memiliki nilai non-null saat keluar.
- Anggota CS8775 - harus memiliki nilai non-null saat keluar.
- Anggota CS8776 - tidak dapat digunakan dalam atribut ini.
- Parameter CS8777 - harus memiliki nilai non-null saat keluar.
- CS8824 - Parameter harus memiliki nilai non-null saat keluar karena parameter tersebut harus non-null.
- CS8825 - Nilai balik harus tidak null karena parameter tidak null.
Pertimbangkan kode berikut:
public bool TryGetMessage(int id, [NotNullWhen(true)] out string? message)
{
message = null;
return true;
}
Pengkompilasi menghasilkan peringatan karena message
parameter ditetapkan null
dan metode mengembalikan true
. Atribut NotNullWhen
menunjukkan bahwa hal tersebut seharusnya tidak terjadi.
Untuk mengatasi peringatan ini, perbarui kode Anda sehingga sesuai dengan harapan atribut yang diterapkan. Anda dapat mengubah atribut, atau algoritma.
Ekspresi sakelar lengkap
Ekspresi pengalihan harus lengkap, yang berarti bahwa semua nilai input harus ditangani. Bahkan untuk jenis referensi yang tidak boleh bernilai null, nilai null
harus dipertanggungjawabkan. Pengkompilasi mengeluarkan peringatan ketika nilai null tidak ditangani:
- CS8655 - Ekspresi pengalihan tidak menangani beberapa input null (tidak lengkap).
- CS8847 - Ekspresi pengalihan tidak menangani beberapa input null (tidak lengkap). Namun, pola dengan klausa 'kapan' mungkin berhasil mencocokkan nilai ini.
Contoh kode berikut menunjukkan kondisi ini:
int AsScale(string status) =>
status switch
{
"Red" => 0,
"Yellow" => 5,
"Green" => 10,
{ } => -1
};
Ekspresi input adalah string
, bukan string?
. Pengkompilasi masih menghasilkan peringatan ini. Pola { }
menangani semua nilai non-null, tetapi tidak cocok dengan null
. Untuk mengatasi kesalahan ini, Anda dapat menambahkan kasus eksplisit null
, atau mengganti { }
dengan _
pola (buang). Pola buang mencocokkan dengan nilai null selain nilai lainnya.