11

最初に、私の下手な英語で申し訳ありません。私はコードの断片を持っています:

long x = 9223372036854775807L;
double f = x;
Console.WriteLine(x);           
Console.WriteLine(f);

出力は次のとおりです。

9223372036854775807
9,22337203685478E+18

このコードのコンパイルおよび実行中にエラーは発生しません。Long を Double に変換する際に精度が失われます。その場合、C# が明示的なキャストを必要としないのはなぜですか?

皆さんありがとう。

4

2 に答える 2

13

この言語には、いくつかの暗黙的な変換が組み込まれています。

次の表はドキュメントからのものです。これが、明示的なキャストまたは変換なしで値を割り当てることが許可されている理由です。

From        To
===============================================================================
sbyte       short , int, long, float, double, or decimal
byte        short , ushort, int, uint, long, ulong, float, double, or decimal
short       int , long, float, double, or decimal
ushort      int , uint, long, ulong, float, double, or decimal
int         long , float, double, or decimal
uint        long , ulong, float, double, or decimal
long        float , double, or decimal
char        ushort , int, uint, long, ulong, float, double, or decimal
float       double
ulong       float , double, or decimal

そして、ドキュメントには次のように記載されています(強調は私のものです):

int、uint、long、または ulong から float への変換、およびlong または ulong から doubleへの変換では、大きさではなく精度が失われる可能性があります。

于 2013-02-13T18:34:18.310 に答える
0

これを試して

long x = 9223372036854775807L;
decimal f = x;
Console.WriteLine(x);
Console.WriteLine(f);
于 2019-10-09T13:51:33.770 に答える