将一种泛型(值)类型强制转换为另一种动态类型是否涉及 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;
鉴于:
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;