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

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

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

Действительно ли возможно определить правила, по которым происходит этот кастинг?

Пример

int a = 1;
float b = (float)a;
int c = (int)b;
11
задан Jimbo 28 April 2010 в 10:46
поделиться

3 ответа

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

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

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.

14
ответ дан 3 December 2019 в 06:45
поделиться

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

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

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

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

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

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

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

4
ответ дан 3 December 2019 в 06:45
поделиться

Вы не можете перегрузить оператор cast в c#, но вместо него можно использовать явные и неявные операторы преобразования:

"Using Conversion Operators (C# Programming Guide)"

0
ответ дан 3 December 2019 в 06:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: