Учитывая этот класс с неявным оператором броска:
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
:
Не мог бросить объект типа 'Система. Int64' для ввода MyDateTime'.
Это говорит мне, что неявные операторы броска C# применяются во время компиляции только и не применяются, когда время выполнения.NET пытается динамично бросить объект к другому типу.
Мои вопросы:
Между прочим, полное приложение - то, что я использую Delegate.DynamicInvoke()
вызывать функцию, которая берет a MyDateTime
параметр и тип аргумента я являюсь передающим к DynamicInvoke
длинное.
Я правильно?
Да, да ты. Чтобы быть выделенным, вы должны сказать: «Определенное пользователем неявное преобразование», а не «неявный литой» - литой (почти) всегда явный. Но ваш вычет о том, что разрешение перегрузки выбирает, какой пользовательский преобразование по вызову при компиляции , а не во время выполнения является правильным.
Есть ли какой-то другой способ сделать это?
Да. В C # 4, если вы вводите свой «объект» как «Dynamic», то мы снова запускаем компилятор при выполнении и повторно выполните весь анализ на операндах , как будто их типы времени компиляции были Текущие типы выполнения . Как вы можете себе представить, это не дешево, хотя мы очень умны о кэшировании и повторно использовании результатов, если вы делаете это в тесной петле.
Добавление явного оператора должна работать: http://msdn.microsoft.com/en-us/library/85w54y0a (vs.80) .aspx