Mengapa Tulis pertama dan kedua berfungsi tetapi bukan yang terakhir? Apakah ada cara saya bisa mengizinkan mereka bertiga dan mendeteksi apakah itu 1, (int) 1 atau saya lewat? Dan benar-benar mengapa satu diperbolehkan tetapi yang terakhir? Yang kedua diizinkan tetapi bukan yang terakhir benar-benar menghantam pikiran saya.
Demo untuk menampilkan kesalahan kompilasi
using System;
class Program
{
public static void Write(short v) { }
static void Main(string[] args)
{
Write(1);//ok
Write((int)1);//ok
int i=1;
Write(i);//error!?
}
}
c#
compiler-errors
int
type-conversion
implicit-conversion
CodesInChaos
sumber
sumber
(short) i
.Jawaban:
Dua yang pertama adalah ekspresi konstan, yang terakhir tidak.
Spesifikasi C # memungkinkan konversi implisit dari int ke kependekan untuk konstanta, tetapi tidak untuk ekspresi lainnya. Ini adalah aturan yang masuk akal, karena untuk konstanta kompiler dapat memastikan bahwa nilai cocok dengan tipe target, tetapi tidak bisa untuk ekspresi normal.
Aturan ini sejalan dengan pedoman bahwa konversi implisit harus tanpa kerugian.
(Dikutip dari C # Language Spesifikasi Versi 3.0)
sumber
Tidak ada konversi implisit dari
int
keshort
karena kemungkinan pemotongan. Namun, ekspresi konstan dapat dianggap sebagai tipe target oleh kompiler .1
? Bukan masalah: itu jelasshort
nilai yang valid .i
? Tidak terlalu banyak - itu bisa berupa nilai>short.MaxValue
misalnya, dan kompiler tidak dapat mengeceknya dalam kasus umum.sumber
Expression<Func<int>>
? Kemudian Anda bisa melewati() => 1
atau() => i
dan di dalam fungsi Anda bisa memeriksa apakah entitas yang lulus berisi variabel yang ditangkap atau nilai konstan.sebuah
int
literal dapat secara implisit dikonversi keshort
. Sedangkan:Jadi, dua karya pertama karena konversi implisit literal diperbolehkan.
sumber
Saya percaya itu karena Anda memberikan literal / konstanta di dua yang pertama, tetapi tidak ada konversi tipe otomatis ketika melewati dalam bilangan bulat di ketiga.
Sunting: Seseorang mengalahkan saya untuk itu!
sumber
Karena tidak akan ada konversi implisit antara tipe Nonliteral ke ukuran pendek yang lebih besar.
Konversi tersirat hanya mungkin untuk ekspresi konstan.
Di mana Anda memberikan
integer
nilai sebagai argumenshort
sumber
Kompiler telah memberi tahu Anda mengapa kode gagal:
Jadi, inilah pertanyaan yang harus Anda tanyakan: mengapa konversi ini gagal? Saya googled "c # convert int short" dan berakhir di halaman MS C # untuk
short
kata kunci:http://msdn.microsoft.com/en-us/library/ybs77ex4(v=vs.71).aspx
Seperti yang dikatakan halaman ini, gips implisit dari tipe data yang lebih besar
short
hanya diizinkan untuk literal. Kompiler dapat mengetahui kapan literal berada di luar jangkauan, tetapi tidak sebaliknya, sehingga perlu diyakinkan bahwa Anda telah menghindari kesalahan di luar jangkauan dalam logika program Anda. Jaminan itu disediakan oleh para pemain.sumber
Konversi dari int -> short dapat mengakibatkan pemotongan data. Itu sebabnya.
sumber