给出:
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
?
答案 0 :(得分:2)
如果不涉及任何值类型,则没有装箱。
另一方面,使用(TOutput)(dynamic)toConvert
而不是(TOutput)(object)toConvert
不会获得任何收益。实际上,情况甚至更糟。
但是在C#7.1及更高版本中,您可以通过使用模式匹配来避免多次转换:
if (toConvert is TOutput output) return output;