Приводит ли приведение одного универсального (значения) к другому с помощью динамического включения / выключения? - PullRequest
1 голос
/ 10 июня 2019

Учитывая:

internal abstract class Animal { }
internal class Dog : Animal { }

Я пытаюсь написать универсальный метод, который можно использовать для преобразования или для преобразования из одного типа в другой, поэтому:

static TOutput ConvertOrCast<TInput, TOutput>(TInput toConvert)
{
    if (toConvert is TOutput) return (TOutput)(dynamic)toConvert;
    return (TOutput)Convert.ChangeType(toConvert, typeof(TOutput));
}

В первой строке мне нужно сначала привести к (object) или (dynamic), чтобы избежать ошибки компилятора "Невозможно преобразовать тип 'TInput' в 'TOutput'".

Я понимаю,например, из this , что использование dynamic обычно включает в себя упаковку / распаковку для типов значений, но происходит ли это в этом случае?Я надеюсь, что компилятор достаточно умен, чтобы признать, что тип ввода уже совпадает с типом вывода, потому что тогда почему бы просто не использовать object вместо dynamic?

1 Ответ

2 голосов
/ 10 июня 2019

Бокс отсутствует, если не задействованы никакие типы значений.

С другой стороны, вы ничего не получите с использованием (TOutput)(dynamic)toConvert вместо (TOutput)(object)toConvert.На самом деле это даже хуже.

Но в C # 7.1 и выше вы можете просто избежать этих многократных приведений, используя сопоставление с образцом:

if (toConvert is TOutput output) return output;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...