Учитывая этот класс с неявным оператором литья:
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;
Это дает время компиляции:
Невозможно неявно преобразовать тип 'object' в 'MyDateTime'.
Имеет смысл для меня.
Теперь я изменяю предыдущий пример следующим образом:
long f = 5;
object g = f;
MyDateTime h = (MyDateTime)g;
Это компилируется отлично. Теперь я получаю время выполнения InvalidCastException
:
Невозможно передать объект типа 'System.Int64' для ввода MyDateTime '.
Это говорит мне, что С# неявные операторы литья применяются только во время компиляции и не применяются, когда среда выполнения .NET пытается динамически передать объект другому типу.
Мои вопросы:
- Правильно ли я?
- Есть ли другой способ сделать это?
Кстати, полное приложение состоит в том, что я использую Delegate.DynamicInvoke()
для вызова функции, которая принимает параметр MyDateTime
, а тип аргумента, который я передаю в DynamicInvoke
, длинный.