У меня есть (например), объект типа A, который я хочу смочь бросить к типу B (подобный тому, как можно бросить int
к a float
)
Типы данных A и B являются моим собственным.
Действительно ли возможно определить правила, по которым происходит этот кастинг?
Пример
int a = 1;
float b = (float)a;
int c = (int)b;
Да, это возможно с использованием перегрузки оператора 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.
Предполагая, что вы хотите, чтобы это была эксплицитная операция, вам нужно написать явный оператор приведения так:
public static explicit operator MyTypeOne(MyTypeTwo i)
{
// code to convert from MyTypeTwo to MyTypeOne
}
Затем вы можете использовать его так:
MyTypeOne a = new MyTypeOne();
MyTypeTwo b = (MyTypeTwo)a;
Я бы задался вопросом, хотите ли вы на самом деле привести один тип к другому, или вы на самом деле хотите конвертировать вместо этого. Я бы сказал, что вам не следует писать операторы приведения для преобразования, если вы просто хотите воспользоваться преимуществами хорошего синтаксиса :)
Также, в целом, рекомендуется не использовать неявные приведения, так как они позволяют непреднамеренные преобразования типов. Из документации MSDN по неявным:
Однако, поскольку неявные преобразования могут происходить без указания программиста их указания, необходимо соблюдать осторожность, чтобы предотвратить неприятные сюрпризы. В в целом, операторы неявного преобразования никогда не должны выбрасывать исключения и никогда не терять информацию, чтобы их можно безопасно использовать без без ведома программиста.
Вы не можете перегрузить оператор cast в c#, но вместо него можно использовать явные и неявные операторы преобразования: