Rumah >pembangunan bahagian belakang >C++ >Mengapa pengendali bersyarat C#(: :) Kadang -kadang gagal pemutus jenis tersirat?
Had penukaran jenis tersirat bagi pengendali bersyarat C# (?:)
Operator bersyarat C# (?:) menyediakan sintaks cawangan bersyarat yang ringkas. Walau bagaimanapun, ia kadangkala menunjukkan tingkah laku yang tidak dijangka apabila ia berkaitan dengan penukaran jenis tersirat.
Pertimbangkan coretan kod berikut:
<code class="language-csharp">bool aBoolValue; byte aByteValue; // 这段代码可以成功编译 if (aBoolValue) aByteValue = 1; else aByteValue = 0; // 这段代码编译失败,并出现错误:“无法将类型“int”隐式转换为“byte”。 aByteValue = aBoolValue ? 1 : 0;</code>
Mengapakah coretan kod pertama disusun, tetapi coretan kod kedua gagal?
Peranan inferens jenis dalam C#
Apabila pengkompil menganalisis kod, ia menentukan jenis pembolehubah dan ungkapan berdasarkan konteks di mana ia digunakan. Proses ini dipanggil inferens jenis. Biasanya, inferens jenis disimpulkan ke luar daripada ungkapan, bukan ke dalam.
Dalam coretan kod pertama, pengkompil menyimpulkan jenis aByteValue berdasarkan tugasan pada setiap cabang pernyataan if-else: aByteValue diberikan nilai 1 atau 0, yang merupakan kedua-dua bait. Oleh itu, pengkompil membuat kesimpulan bahawa aByteValue ialah bait.
Maksud ungkapan bersyarat
Pengendali bersyarat menilai dua ungkapan: ungkapan hasil dan ungkapan alternatif. Jenis ungkapan bersyarat ialah jenis yang lebih umum bagi kedua-dua ungkapan.
Dalam coretan kod kedua, kedua-dua ungkapan hasil dan ungkapan alternatif dinilai kepada integer (masing-masing 1 dan 0). Oleh itu, pengkompil membuat kesimpulan bahawa ungkapan bersyarat adalah jenis int.
Tukar kepada jenis yang serasi
Oleh kerana ungkapan bersyarat menilai kepada int, ia tidak boleh ditukar secara tersirat kepada bait. Untuk menyelesaikan masalah ini, anda perlu menukar ungkapan secara eksplisit kepada bait, seperti yang ditunjukkan dalam kod berikut:
<code class="language-csharp">aByteValue = aBoolValue ? (byte)1 : (byte)0;</code>
Atas ialah kandungan terperinci Mengapa pengendali bersyarat C#(: :) Kadang -kadang gagal pemutus jenis tersirat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!