Приведем сразу пример приведения типов в C#:
public struct Currency { // неявное приведение типа public static implicit operator float(Currency value) { return value.Grn + (value.Kop / 100.0f); } // явное приведение типа public static explicit operator Currency(float value) { checked { uint Grn = (uint)value; ushort Kop = (ushort)((value - Grn) * 100); return new Currency(Grn, Kop); } } } ... // неявное преобразование Currency balance = new Currency(10,50); // 10 грн. 50 коп. float D = balance; // нужно чтобы D было присвоено 10.50 // явное преобразование float money = 45.63f; Currency myMoney = (Currency)money;
Нельзя осуществлять приведение типов между классами, один из которых явно или неявно является производным от другого. Приведение типа может быть объявлено внутри любого типа-источника, либо типа-приемника.
Всегда можно неявно привести производный класс к базовому, а базовый явно к производному. Ссылка на базовый тип может ссылаться как на объекты базового класса, так и на объекты производные от него.
Currency c = new Currency(); Base cb = new Currency(); // неявное приведение Currency к Base
Если объект не является экземпляром производного класса (или любого класса, являющегося производным от него, преобразования типа не происходит и генерируется исключение.
Base b = new Currency(); Base bs = new Base(); Currency c1 = (Currency)b; Currency c2 = (Currency)bs; // неверно, приходится отсекать данные
Упаковка:
Currency c = new Currency(); object b = c; // функц. C будет потеряна
Распаковка:
object c = new Currency(); object b = new object(); Currency c1 = (Currency)c; // возможно Currency c2 = (Currency)c; // не возможно
Приведение типов очень тонкая, местами опасная вещь (Console.WriteLine(Curreny) – не существует перегруженной версии для Currency поэтому, объект будет преобразовано к float или uint (которые мы определили выше) что может вызвать вывод не правильного резульатат).