Кастинг между типами данных в С#

У меня есть (например) объект типа A, который я хочу использовать для ввода типа B (аналогично тому, как вы можете применить int к float)

Типы данных A и B являются моими.

Можно ли определить правила, с помощью которых происходит это кастинг?

Пример

int a = 1;
float b = (float)a;
int c = (int)b;

Ответ 1

Да, это возможно с использованием перегрузки оператора С#. Существуют две версии explicit и неявный.

Вот полный пример:

class Program
{
    static void Main(string[] args)
    {
        A a1 = new A(1);
        B b1 = a1;

        B b2 = new B(1.1);
        A a2 = (A)b2;
    }
}

class A
{
    public int Foo;

    public A(int foo)
    {
        this.Foo = foo;
    }

    public static implicit operator B(A a)
    {
        return new B(a.Foo);
    }
}

class B
{
    public double Bar;

    public B(double bar)
    {
        this.Bar = bar;
    }

    public static explicit operator A(B b)
    {
        return new A((int)b.Bar);
    }
}

Тип A может быть введен неявным образом для типа B, но тип B должен быть явно указан для типа A.

Ответ 2

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

public static explicit operator MyTypeOne(MyTypeTwo i)
{
    // code to convert from MyTypeTwo to MyTypeOne
}

Затем вы можете использовать его так:

MyTypeOne a = new MyTypeOne();
MyTypeTwo b = (MyTypeTwo)a;

Я бы поставил вопрос, хотите ли вы на самом деле перевести один тип в другой или хотите ли вы вместо этого конвертировать. Я бы сказал, что вам следует избегать написания операторов трансляции для конверсий, если вы просто хотите воспользоваться хорошим синтаксисом:)

Кроме того, в целом рекомендуется не использовать неявные приведения, поскольку они допускают непреднамеренные преобразования типа. Из Документация MSDN на неявный:

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