Вкинувши 2c - здається, що концептуальне розмежування може бути корисним. Не те, що я фахівець ..:
Кастинг змінює репрезентативний тип. Тож "32" та 32L та 32.0f здаються розумними для перекидання між собою. c # не підтримуватиме "32" автоматично, але більшість динамічних мов підтримуватимуть. Тож я буду використовувати (довгий) "32" або (String) 32L. Коли зможу. У мене також є ще одне правило - кастинг має бути з можливістю повернення.
Перетворення не повинно бути круглим шляхом, а просто може створити абсолютно новий об'єкт.
Сіра область - це, наприклад, рядок "32xx". Можна навести випадок, що коли ви його кидаєте, він стає 32 літрами (число було проаналізовано, поки цього не могло бути). Perl цим скористався. Але тоді це порушує мою вимогу туди-назад. Те саме стосується 32,5f до 32L. Майже всі мови, включаючи дуже статично набрані, дозволяють це, і це також не відповідає правилу кругового відсікання. Він сірий, оскільки якщо ви дозволяєте кидати "32", то під час компіляції ви не знаєте, чи може це бути "32xxx".
Ще одна відмінність, яку можна зробити, - це просто використовувати кастинг для "IsA", а не для "makeLookLikeA". Отже, якщо ви знаєте, що рядок походить з бази даних, але насправді це int у неофіційній схемі, сміливо використовуйте привід (хоча в цьому випадку c # хоче, щоб ви все одно використовували Convert). Те саме стосується і поплавця. Але не для того, коли ви просто використовуєте акторський склад для зрізання поплавця. Ця різниця також враховує DownCasting та UpCasting - об'єкт завжди був "IsA", але тип міг бути узагальненим для списку.
Convert.To(). Тому моє запитання є доповненням до вашого запитання.