通用方法返回动态的原因不明

时间:2018-05-11 19:07:57

标签: c#

我有以下通用方法签名

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?”

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

1 个答案:

答案 0 :(得分:3)

使用类型dynamic的值执行的所有几乎会产生dynamic的值。当然,您知道要调用的TryConvertToEnum方法的返回类型 - 但是您正在传递动态参数,这意味着它在执行时间之前不会被绑定。在执行时,可能存在具有string参数和不同返回类型的整个其他方法。

有一些非常的表达式案例,其中包含动态值但仍然没有dynamic的结果类型。在我的头顶,它们是:

  • 构造函数调用(始终是正在构造的类型)
  • is运营商(总是布尔)
  • as运算符(始终是名为第二个操作数的类型)

在您的情况下,只需使用object代替dynamic,呼叫将被静态绑定,而value将属于MyEnum?类型。