Кастинг обычно создает новый объект, который в этом случае не нужен
Более эффективный способ сделать это - через базовый класс или интерфейс.
class Type1 : IOperatableType {}
class Type2 : IOperatableType {}
class Type3 : IOperatableType {}
void Operate ( IOperatableType a )
или
class Type1 : Type0 {}
class Type2 : Type0 {}
class Type3 : Type0 {}
void Operate ( Type0 a )
Вызывающий метод (в этом случае работает) зависит от использования методов или свойств его параметров. Если эти свойства / методы определены для всех типов (тип1, тип2, тип3), рассмотрите возможность использования интерфейса, который определяет общие функции. Если реализация свойств и методов одинакова, избавьтесь от повторяющегося кода и рассмотрите возможность наследования от базового класса.
Кроме того, при попытке понять ваш код разработчики с большей вероятностью сначала смотрят на диаграмму классов, которая позволяет им увидеть взаимосвязь между классами, или, по крайней мере, определение класса (которое покажет базовые типы и реализованные интерфейсы). ) вместо того, чтобы изучать (неявные / явные) операторы, чтобы увидеть, какой класс можно преобразовать в какой другой класс.