×
Traktatov.net » C# 4.0: полное руководство » Читать онлайн
Страница 45 из 650 Настройки

>

>  }

>}


Если тип long может быть преобразован в тип double неявно, то обратное преобразование типа double в тип long неявным образом невозможно, поскольку оно не является расширяющим. Следовательно, приведенный ниже вариант предыдущей программы составлен неправильно.


>// *** Эта программа не может быть скомпилирована. ***

>using System;

>/

>class LtoD {

>  static void Main() { long L; double D;

>    D = 100123285.0;

>    L = D; // Недопустимо!!!

>    Console.WriteLine("L и D: " + L + " " + D);

>  }

>}


Помимо упомянутых выше ограничений, не допускается неявное взаимное преобразование типов decimal и float или double, а также числовых типов и char или bool. Кроме того, типы char и bool несовместимы друг с другом.


Приведение несовместимых типов

Несмотря на всю полезность неявных преобразований типов, они неспособны удовлетворить все потребности в программировании, поскольку допускают лишь расширяющие преобразования совместимых типов. А во всех остальных случаях приходится обращаться к приведению типов. Приведение — это команда компилятору преобразовать результат вычисления выражения в указанный тип. А для этого требуется явное преобразование типов. Ниже приведена общая форма приведения типов.


>(целевой_тип) выражение


Здесь целевой_тип обозначает тот тип, в который желательно преобразовать указанное выражение. Рассмотрим для примера следующее объявление переменных.


>double х, у;


Если результат вычисления выражения х/у должен быть типа int, то следует записать следующее.


>(int) (х / у)


Несмотря на то что переменные х и у относятся к типу double, результат вычисления выражения х/у преобразуется в тип int благодаря приведению. В данном примере выражение х/у следует непременно указывать в скобках, иначе приведение к типу int будет распространяться только на переменную х, а не на результат ее деления на переменную у. Приведение типов в данном случае требуется потому, что неявное преобразование типа double в тип int невозможно.

Если приведение типов приводит к сужающему преобразованию, то часть информации может быть потеряна. Например, в результате приведения типа long к типу int часть информации потеряется, если значение типа long окажется больше диапазона представления чисел для типа int, поскольку старшие разряды этого числового значения отбрасываются. Когда же значение с плавающей точкой приводится к целочисленному, то в результате усечения теряется дробная часть этого числового значения. Так, если присвоить значение 1,23 целочисленной переменной, то в результате в ней останется лишь целая часть исходного числа (1), а дробная его часть (0,23) будет потеряна.

В следующем примере программы демонстрируется ряд преобразований типов, требующих приведения. В этом примере показан также ряд ситуаций, в которых приведение типов становится причиной потери данных.


>// Продемонстрировать приведение типов.

>using System;

>class CastDemo {

>  static void Main() {

>    double x, y;

>    byte b;

>    int i;

>    char ch;

>    uint u;

>    short s;

>    long l;


>    x = 10.0;

>    y = 3.0;


>    // Приведение типа double к типу int, дробная часть числа теряется,