首页 > 解决方案 > 通用方法由于未知原因返回动态

问题描述

我有以下通用方法签名

public static T? TryConvertToEnum<T>(object obj, T? defaultValue = null) where T : struct, IConvertible

这工作正常!我遇到的问题是 VS 在此调用中似乎出现了意外行为:

dynamic dynamicValue = "1";
var value= ConversionHelper.TryConvertToEnum<MyEnum>(dynamicValue);

问题是“值”的类型是“动态的”,我不知道为什么我希望它是“MyEnum?”

有没有人预料到这种行为或知道为什么会这样?

标签: c#

解决方案


几乎你对 type 值所做的所有事情都会dynamic产生dynamic. 当然,您知道TryConvertToEnum要调用的方法的返回类型——但是您传入的是动态参数,这意味着它直到执行时才被绑定。在执行时,可能会有一个带有string参数和不同返回类型的其他方法。

少数情况下,表达式包含动态值但仍然没有结果类型dynamic. 在我的脑海中,它们是:

  • 构造函数调用(总是被构造的类型)
  • 运算符(is总是布尔值)
  • as运算符(总是命名为第二个操作数的类型)

在您的情况下,只需使用object而不是dynamic调用将被静态绑定,并且value类型为MyEnum?.


推荐阅读