Учитывая этот класс с неявным оператором приведения:
public class MyDateTime
{
public static implicit operator MyDateTime(System.Int64 encoded)
{
return new MyDateTime(encoded);
}
public MyDateTime(System.Int64 encoded)
{
_encoded = encoded;
}
System.Int64 _encoded;
}
Теперь я могу сделать следующее:
long a = 5;
MyDateTime b = a;
Но НЕ следующее:
long f = 5;
object g = f;
MyDateTime h = g;
Это дает время компиляции:
Невозможно неявно преобразовать тип «объект» в «MyDateTime».
Имеет смысл для меня.
Теперь я модифицирую предыдущий пример следующим образом:
long f = 5;
object g = f;
MyDateTime h = (MyDateTime)g;
Это компилируется нормально. Теперь я получаю среду выполнения InvalidCastException
:
Невозможно преобразовать объект типа «System.Int64» в тип MyDateTime.
Это говорит мне о том, что операторы неявного приведения C# применяются только во время компиляции и не применяются, когда среда выполнения .NET пытается динамически преобразовать объект в другой тип.
Мои вопросы:
- Я прав?
- Есть ли другой способ сделать это?
Кстати, полное приложение заключается в том, что я использую Delegate.DynamicInvoke()
для вызова функции, которая принимает параметр MyDateTime
, а тип аргумента, который я передаю в DynamicInvoke
, является длинным.