variable usa reservada que programacion para palabra mostrar float declaracion decimales c# .net double decimal

usa - ¿Por qué c#decimales no se pueden inicializar sin el sufijo M?



palabra reservada double (6)

Cada literal se trata como un tipo. Si no elige el sufijo ''M'', se trata como un double . Que no se puede convertir implicitly un double en un decimal es bastante comprensible ya que pierde precisión.

public class MyClass { public const Decimal CONSTANT = 0.50; // ERROR CS0664 }

produce este error:

error CS0664: Literal de tipo double no se puede convertir implícitamente a tipo ''decimal''; usa un sufijo ''M'' para crear un literal de este tipo

como está documented . Pero esto funciona:

public class MyClass { public const Decimal CONSTANT = 50; // OK }

Y me pregunto por qué prohíben la primera. Me parece extraño.


Desde http://msdn.microsoft.com/en-us/library/364x0z75.aspx : no hay conversión implícita entre los tipos de coma flotante y el tipo decimal; por lo tanto, se debe usar un yeso para convertir estos dos tipos.

Lo hacen porque el doble tiene un rango tan grande ± 5.0 × 10-324 a ± 1.7 × 10 308 mientras que int es solo -2,147,483,648 a 2,147,483,647. El rango de un decimal es (-7.9 x 10 28 a 7.9 x 10 28 ) / (10 0 a 28 ) por lo que puede contener un int pero no un doble.


El primer ejemplo es un doble literal. El segundo ejemplo es un literal entero.

Supongo que no es posible convertir de doble a decimal sin una posible pérdida de precisión, pero está bien con un número entero. Entonces permiten la conversión implícita con un número entero.


El tipo de literal sin el sufijo m es double , es tan simple como eso. No puede inicializar un float esa manera:

float x = 10.0; // Fail

El tipo del literal debe quedar claro a partir del literal mismo, y el tipo de variable a la que se le asigna debe ser asignable del tipo de ese literal. Entonces, su segundo ejemplo funciona porque hay una conversión implícita de int (el tipo del literal) a decimal . No hay conversión implícita de double a decimal (ya que puede perder información).

Personalmente, hubiera preferido que no hubiera habido un valor predeterminado o si el valor predeterminado hubiera sido decimal , pero esa es una cuestión diferente ...


Es una opción de diseño que crearon los creadores de C #.

Probablemente surja que el double puede perder precisión y no querían que almacenaras esa pérdida. int no tiene ese problema.


Su respuesta es un poco inferior en el mismo enlace que proporcionó, también Here . En las conversiones:

"Los tipos integrales se convierten implícitamente a decimal y el resultado se evalúa a decimal. Por lo tanto, puede inicializar una variable decimal utilizando un literal entero, sin el sufijo".

Entonces, la razón es debido a la conversión implícita entre int y decimal. Y como 0.50 se trata como doble, y no hay una conversión implícita entre doble y decimal, se obtiene el error.

Para más detalles:

http://msdn.microsoft.com/en-us/library/y5b434w4(v=vs.80).aspx

http://msdn.microsoft.com/en-us/library/yht2cx7b.aspx