2012-03-15 8 views

Odpowiedz

3

z opisu (§ 2.4.4.2)

Jeżeli dosłownym ma sufiks, ma pierwszy z tych typów, w którym jego wartość może być reprezentowane: int, uint, long, ulong.

Tak mniejsze typy nie są automatycznie wnioskowane. Możesz dodać odlew zmusić takiego mniejszego typu:

var s = (short)0; 
+0

to dobrze napisać krótki s = 0, a przynajmniej jest to wersja krótsza – Dhananjay

+0

Tak, możesz, ale pewnie już to wiedziałeś, odniosłem wrażenie, że twoje zamieszanie wynika z tego, dlaczego kompilator nie potraktuje "0" jako krótkiego automatycznie. – Joey

2

C# kompilator wnioskuje typ być Int32. I nie można go domyślnie rzucić na short lub byte, ponieważ są one mniejsze i można stracić dane.

Jeśli chcesz kompilator wywnioskować decimal można:

var s = 0M; 
5

Zgodnie ze standardem języka C#, a konkretnie §2.4.4.2 on integer literals:

Typ integer dosłownym określa się następująco :

  • Jeśli literał nie ma sufiksu, ma pierwszy z tych typów, w którym może być reprezentowana jego wartość ted: int, uint, long, ulong.
  • Jeśli literał ma przyrostek U lub u, ma on pierwszy z tych typów, w którym jego wartość może być reprezentowana: uint, ulong.
  • Jeśli literał ma przyrostek L lub l, ma on pierwszy z tych typów, w którym jego wartość może być reprezentowana: long, ulong.
  • Jeśli dosłowny jest sufiksem UL, Ul, uL, ul, LU, Lu, lU lub lu, to jest typu ulong.

Pierwsza zasada to wszystko, co należy tutaj zastosować. Dosłowny 0 nie ma przyrostka i może być reprezentowany jako typ int (lub, w kategoriach BCL, Int32), więc jest to typ, który ma.

Jak można wywnioskować z powyższego, aby zmienić typ literału, można do niego dodać przyrostek. Na przykład literał 0u będzie typu uint.Alternatywnie możesz jawnie rzucić literał na inny typ; na przykład: (short)0 spowoduje, że kompilator potraktuje literał jako short.

5

Spójrz na ten wpis here w StackOverflow.

Można określić przyrostek dla wszystkich liczb.

var i = 0; 
var d = 0d; 
var f = 0f; 
var l = 0L; 
var m = 0m; 
Powiązane problemy