Существует ли способ сделать динамическое неявное преобразование типа в C#?

Учитывая этот класс с неявным оператором броска:

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 пытается динамично бросить объект к другому типу.

Мои вопросы:

  1. Я корректен?
  2. Там некоторый другой путь состоит в том, чтобы сделать это?

Между прочим, полное приложение - то, что я использую Delegate.DynamicInvoke() вызывать функцию, которая берет a MyDateTime параметр и тип аргумента я являюсь передающим к DynamicInvoke длинное.

11
задан YOU 25 March 2011 в 14:15
поделиться

2 ответа

Я правильно?

Да, да ты. Чтобы быть выделенным, вы должны сказать: «Определенное пользователем неявное преобразование», а не «неявный литой» - литой (почти) всегда явный. Но ваш вычет о том, что разрешение перегрузки выбирает, какой пользовательский преобразование по вызову при компиляции , а не во время выполнения является правильным.

Есть ли какой-то другой способ сделать это?

Да. В C # 4, если вы вводите свой «объект» как «Dynamic», то мы снова запускаем компилятор при выполнении и повторно выполните весь анализ на операндах , как будто их типы времени компиляции были Текущие типы выполнения . Как вы можете себе представить, это не дешево, хотя мы очень умны о кэшировании и повторно использовании результатов, если вы делаете это в тесной петле.

14
ответ дан 3 December 2019 в 11:04
поделиться

Добавление явного оператора должна работать: http://msdn.microsoft.com/en-us/library/85w54y0a (vs.80) .aspx

-4
ответ дан 3 December 2019 в 11:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: