将一种泛型(值)类型强制转换为另一种动态类型是否涉及 boxing/unboxing?

Does casting one generic (value) type to another with dynamic involve boxing/unboxing?

鉴于:

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) 以避免编译器错误 "Cannot convert type 'TInput' to 'TOutput'".

我明白,例如来自 this,使用 dynamic 通常涉及 boxing/unboxing 作为值类型,但在这种情况下会发生这种情况吗?我希望编译器足够聪明,可以识别输入类型已经与输出类型相同,因为那为什么不直接使用 object 而不是 dynamic

如果不涉及值类型,则不装箱。

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

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

if (toConvert is TOutput output) return output;