Приведение типов данных в C # - PullRequest
11 голосов
/ 28 апреля 2010

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

Типы данныхА и В - мои.

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

Пример

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

Ответы [ 3 ]

14 голосов
/ 28 апреля 2010

Да, это возможно с использованием перегрузки оператора 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.

4 голосов
/ 28 апреля 2010

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

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

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

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

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

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

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

0 голосов
/ 28 апреля 2010

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

" Использование операторов преобразования (Руководство по программированию в C #) "

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...