int i; float f; i = 10; f = i; // присвоить целое значение переменной типа float Если в одной операции присваивания смешиваются совместимые типы данных, то значение в правой части оператора присваивания автоматически преобразуется в тип, указанный в левой его части. Поэтому в приведенном выше фрагменте кода значение переменной i сначала преобразуется в тип float, а затем присваивается переменной f. Но вследствие строгого контроля типов далеко не все типы данных в С# оказываются полностью совместимыми, а следовательно, не все преобразова ния типов разрешены в неявном виде. Например, типы bool и int несовместимы. Правда, преобразование несовместимых типов все-таки может быть осуществлено путем приведения. Приведение типов, по существу, означает явное их преобразова ние. В этом разделе рассматривается как автоматическое преобразование, так и при ведение типов. ### Автоматическое преобразование типов Когда данные одного типа присваиваются переменной другого типа, неявное преоб разование типов происходит автоматически при следующих условиях: * оба типа совместимы; * диапазон представления чисел целевого типа шире, чем у исходного типа. * Если оба эти условия удовлетворяются, то происходит расширяющее преобразование. Например, тип int достаточно крупный, чтобы вмещать в себя все действительные значения типа byte, а кроме того, оба типа, int и byte, являются совместимыми цело численными типами, и поэтому для них вполне возможно неявное преобразование. Числовые типы, как целочисленные, так и с плавающей точкой, вполне совместимы друг с другом для выполнения расширяющих преобразований. Так, приведенная ниже программа составлена совершенно правильно, поскольку преобразование типа long в тип double является расширяющим и выполняется автоматически.
// Продемонстрировать неявное преобразование типа long в тип double. using System;
class LtoD { static void Main { long L; double D; L = 100123285L; D = L; Console.WriteLine("L и D: " + L + " " + D); } } Если тип long может быть преобразован в тип double неявно, то обратное пре образование типа double в тип long неявным образом невозможно, поскольку оно не является расширяющим. Следовательно, приведенный ниже вариант предыдущей программы составлен неправильно.
//
(целевой_тип) выражение Здесь целевой_тип обозначает тот тип, в который желательно преобразовать ука занное выражение. Рассмотрим для примера следующее объявление переменных.
double х, у; Если результат вычисления выражения х/у должен быть типа int, то следует за писать следующее.
(int) (х / у) Несмотря на то что переменные х и у относятся к типу double, результат вычисле ния выражения х/у преобразуется в тип int благодаря приведению. В данном приме ре выражение х/у следует непременно указывать в скобках, иначе приведение к типу int будет распространяться только на переменную х, а не на результат ее деления на переменную у. Приведение типов в данном случае требуется потому, что неявное пре образование типа double в тип int невозможно. Если приведение типов приводит к сужающему преобразованию, то часть информа ции может быть потеряна. Например, в результате приведения типа long к типу int часть информации потеряется, если значение типа long окажется больше диапазона представления чисел для типа int, поскольку старшие разряды этого числового значе ния отбрасываются. Когда же значение с плавающей точкой приводится к целочислен ному, то в результате усечения теряется дробная часть этого числового значения. Так, если присвоить значение 1,23 целочисленной переменной, то в результате в ней оста нется лишь целая часть исходного числа (1), а дробная его часть (0,23) будет потеряна. В следующем примере программы демонстрируется ряд преобразований типов, требующих приведения. В этом примере показан также ряд ситуаций, в которых при ведение типов становится причиной потери данных.
// Продемонстрировать приведение типов. using System;