Jawaban:
Jawaban lain sejauh ini semuanya benar; Saya hanya ingin menambahkan satu lagi yang sedikit lebih bersih:
v2 = v1 ?? default(int);
Apa Nullable<T>
pun secara implisit dapat dikonversi menjadi miliknya T
, DISEDIAKAN bahwa seluruh ekspresi yang dievaluasi tidak pernah dapat menghasilkan penugasan nol ke ValueType. Jadi, operator null-coalescing ??
hanyalah sintaksis gula untuk operator ternary:
v2 = v1 == null ? default(int) : v1;
... yang pada gilirannya adalah sintaksis gula untuk if / else:
if(v1==null)
v2 = default(int);
else
v2 = v1;
Juga, pada .NET 4.0, Nullable<T>
memiliki metode "GetValueOrDefault ()", yang merupakan pengambil aman-nol yang pada dasarnya melakukan penggabungan-nol yang ditunjukkan di atas, jadi ini juga berfungsi:
v2 = v1.GetValueOrDefault();
default(int)
benar-benar dibutuhkan? Apa yang salah dengan yang sederhana 0
?
default
sesuai. Nol tidak selalu valid sebagai nilai, apalagi standarnya, jadi jika Anda mengganti int
dengan generik T
Anda akan menemukan kode saya berfungsi sementara nol tidak. Dalam beberapa versi kerangka kerja masa depan, default
mungkin juga menjadi kelebihan beban; jika dan ketika itu terjadi, kode yang menggunakan standar akan dengan mudah dapat mengambil keuntungan, sementara penetapan nol atau nol yang eksplisit harus diubah.
Seperti ini,
if(v1.HasValue)
v2=v1.Value
Anda bisa menggunakan properti Value untuk penugasan.
v2 = v1.Value;
v1.HasValue
dulu.
Jika Anda tahu yang v1
memiliki nilai, Anda dapat menggunakan Value
properti:
v2 = v1.Value;
Menggunakan GetValueOrDefault
metode ini akan menetapkan nilai jika ada, jika tidak, default untuk tipe, atau nilai default yang Anda tentukan:
v2 = v1.GetValueOrDefault(); // assigns zero if v1 has no value
v2 = v1.GetValueOrDefault(-1); // assigns -1 if v1 has no value
Anda dapat menggunakan HasValue
properti untuk memeriksa apakah v1
memiliki nilai:
if (v1.HasValue) {
v2 = v1.Value;
}
Ada juga dukungan bahasa untuk GetValueOrDefault(T)
metode ini:
v2 = v1 ?? -1;
Anda tidak dapat melakukannya jika v1 nol, tetapi Anda dapat memeriksa dengan operator.
v2 = v1 ?? 0;
GetValueOrDefault()
mengambil nilai objek. Jika nol, mengembalikan nilai default int, yaitu 0.
Contoh:
v2= v1.GetValueOrDefault();
Jika nilai default untuk jenis yang diberikan adalah hasil yang dapat diterima:
if (v1.HasValue)
v2 = v1.GetValueOrDefault();
Jika Anda menginginkan nilai default yang berbeda ketika hasilnya tidak ditentukan:
v2 = v1.GetValueOrDefault(255); // or any valid value for int in place of 255
Jika Anda hanya ingin nilai dikembalikan (tidak masalah jika metode gagal atau tidak):
v2 = v1.GetValueOrDefault();
.NET 4.7.2 .: GetValueOrDefault()
mengembalikan nilai bidang tanpa pengecekan.
Sejauh yang saya ketahui solusi terbaik adalah menggunakan GetValueOrDefault()
metode.
v2 = v1.GetValueOrDefault();
Kon nullable ke int konversi dapat dilakukan seperti ini:
v2=(int)v1;
itu mungkin dengan v2 = Convert.ToInt32(v1);
Konversi sederhana antara v1
dan v2
tidak dimungkinkan karena v1
memiliki domain nilai yang lebih besar daripada v2
. Itu semua v1
bisa tahan ditambah null
negara. Untuk mengonversi, Anda harus secara eksplisit menyatakan nilai apa yang int
akan digunakan untuk memetakan null
status. Cara paling sederhana untuk melakukan ini adalah ??
operator
v2 = v1 ?? 0; // maps null of v1 to 0
Ini juga bisa dilakukan dalam bentuk panjang
int v2;
if (v1.HasValue) {
v2 = v1.Value;
} else {
v2 = 0;
}
Bergantung pada konteks penggunaan Anda, Anda dapat menggunakan fitur pencocokan pola C # 7:
int? v1 = 100;
if (v1 is int v2)
{
Console.WriteLine($"I'm not nullable anymore: {v2}");
}
Karena beberapa orang downvoting tanpa meninggalkan penjelasan, saya ingin menambahkan beberapa detail untuk menjelaskan alasan untuk memasukkan ini sebagai solusi yang layak.
Pencocokan pola C # 7 sekarang memungkinkan kami memeriksa jenis nilai dan melemparkannya secara implisit. Dalam cuplikan di atas, jika-kondisi hanya akan berlalu ketika nilai yang disimpan di v1
adalah tipe-kompatibel dengan tipe v2
, yang dalam hal ini adalah int
. Oleh karena itu ketika nilai untuk v1
adalah null
, jika-kondisi akan gagal karena nol tidak dapat ditugaskan ke int
. Lebih tepatnya, null
bukan int
.
Saya ingin menekankan bahwa solusi ini mungkin tidak selalu menjadi pilihan optimal. Seperti yang saya sarankan, saya percaya ini akan tergantung pada konteks penggunaan tepat pengembang. Jika Anda sudah memiliki int?
dan ingin beroperasi secara kondisional pada nilainya jika-dan-hanya-jika nilai yang diberikan tidak nol (ini adalah satu-satunya waktu aman untuk mengkonversi int nullable ke int reguler tanpa kehilangan informasi), lalu pencocokan pola mungkin salah satu cara paling ringkas untuk melakukan ini.
HasValue
cek Anda .
Di C # 7.1 dan yang lebih baru, ketik dapat disimpulkan dengan menggunakan default
literal alih-alih default
operator sehingga dapat dituliskan seperti di bawah ini:
v2 = v1 ?? default;
int v2= Int32.Parse(v1.ToString());
v1
itunull
?