Кастинг между типами данных в С#
У меня есть (например) объект типа 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 на неявный:
Однако, поскольку неявные преобразования может произойти без указав их, следует позаботиться о том, чтобы предотвратить неприятные сюрпризы. В общие, неявные операторы преобразования никогда не должны бросать исключения и никогда не теряйте информацию, чтобы они могут безопасно использоваться без программист.
Ответ 3
Вы не можете перегрузить оператор трансляции в С#, но вместо этого вы можете использовать явные и неявные операторы преобразования:
" Использование операторов преобразования (Руководство по программированию на С#)"