通过动态将一种通用(值)类型转换为另一种类型(值)是否涉及装箱/拆箱?

时间:2019-06-10 15:05:47

标签: c# generics type-conversion type-inference boxing

给出:

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 个答案:

答案 0 :(得分:2)

如果不涉及任何值类型,则没有装箱。

另一方面,使用(TOutput)(dynamic)toConvert而不是(TOutput)(object)toConvert不会获得任何收益。实际上,情况甚至更糟。

但是在C#7.1及更高版本中,您可以通过使用模式匹配来避免多次转换:

if (toConvert is TOutput output) return output;