Bagaimana cara mengonversi nullable int
menjadi int
? Misalkan saya memiliki 2 jenis int seperti di bawah ini:
int? v1;
int v2;
Saya ingin memberikan v1
nilai kepada v2
. v2 = v1;
akan menyebabkan kesalahan. Bagaimana cara mengkonversi v1
ke v2
?
v1
itunull
?Jawaban:
Jawaban lain sejauh ini semuanya benar; Saya hanya ingin menambahkan satu lagi yang sedikit lebih bersih:
Apa
Nullable<T>
pun secara implisit dapat dikonversi menjadi miliknyaT
, DISEDIAKAN bahwa seluruh ekspresi yang dievaluasi tidak pernah dapat menghasilkan penugasan nol ke ValueType. Jadi, operator null-coalescing??
hanyalah sintaksis gula untuk operator ternary:... yang pada gilirannya adalah sintaksis gula untuk if / else:
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:sumber
default(int)
benar-benar dibutuhkan? Apa yang salah dengan yang sederhana0
?default
sesuai. Nol tidak selalu valid sebagai nilai, apalagi standarnya, jadi jika Anda menggantiint
dengan generikT
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,
sumber
Anda bisa menggunakan properti Value untuk penugasan.
sumber
v1.HasValue
dulu.v1
adanull
. Menurut pendapat saya, ini bukan jawaban yang benar.Yang kamu butuhkan adalah..
sumber
Jika Anda tahu yang
v1
memiliki nilai, Anda dapat menggunakanValue
properti:Menggunakan
GetValueOrDefault
metode ini akan menetapkan nilai jika ada, jika tidak, default untuk tipe, atau nilai default yang Anda tentukan:Anda dapat menggunakan
HasValue
properti untuk memeriksa apakahv1
memiliki nilai:Ada juga dukungan bahasa untuk
GetValueOrDefault(T)
metode ini:sumber
Anda tidak dapat melakukannya jika v1 nol, tetapi Anda dapat memeriksa dengan operator.
sumber
mengambil nilai objek. Jika nol, mengembalikan nilai default int, yaitu 0.
Contoh:
sumber
Jika nilai default untuk jenis yang diberikan adalah hasil yang dapat diterima:
Jika Anda menginginkan nilai default yang berbeda ketika hasilnya tidak ditentukan:
Jika Anda hanya ingin nilai dikembalikan (tidak masalah jika metode gagal atau tidak):
.NET 4.7.2 .:
GetValueOrDefault()
mengembalikan nilai bidang tanpa pengecekan.sumber
Sejauh yang saya ketahui solusi terbaik adalah menggunakan
GetValueOrDefault()
metode.sumber
Kon nullable ke int konversi dapat dilakukan seperti ini:
sumber
itu mungkin dengan
v2 = Convert.ToInt32(v1);
sumber
Anda bisa melakukannya
sumber
Konversi sederhana antara
v1
danv2
tidak dimungkinkan karenav1
memiliki domain nilai yang lebih besar daripadav2
. Itu semuav1
bisa tahan ditambahnull
negara. Untuk mengonversi, Anda harus secara eksplisit menyatakan nilai apa yangint
akan digunakan untuk memetakannull
status. Cara paling sederhana untuk melakukan ini adalah??
operatorIni juga bisa dilakukan dalam bentuk panjang
sumber
Bergantung pada konteks penggunaan Anda, Anda dapat menggunakan fitur pencocokan pola C # 7:
EDIT:
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 tipev2
, yang dalam hal ini adalahint
. Oleh karena itu ketika nilai untukv1
adalahnull
, jika-kondisi akan gagal karena nol tidak dapat ditugaskan keint
. Lebih tepatnya,null
bukanint
.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.sumber
HasValue
cek Anda .Ini akan memberikan nilai
v1
kev2
jika bukan nol, jika tidak maka akan mengambil nilai default sebagai nol.Atau di bawah ini adalah cara lain untuk menulisnya.
sumber
Di C # 7.1 dan yang lebih baru, ketik dapat disimpulkan dengan menggunakan
default
literal alih-alihdefault
operator sehingga dapat dituliskan seperti di bawah ini:sumber
sumber