【问题标题】:Generic method return dynamic for unknown reason [duplicate]通用方法由于未知原因返回动态[重复]
【发布时间】:2018-05-12 04:23:14
【问题描述】:

我有以下通用方法签名

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# 7.3 你可以使用where T : Enum
  • @SebastianHofmann 你需要VS 2017.7 ....
  • dynamic 是一种类型...它不是像var 这样的语法糖。
  • 您可以将变量声明为 MyEnum 值而不是 var。

标签: c#


【解决方案1】:

几乎所有您使用dynamic 类型的值执行的操作都会产生dynamic 的值。当然,您知道您打算调用的 TryConvertToEnum 方法的返回类型 - 但您传入的是一个动态参数,这意味着它直到执行时才被绑定。在执行时,可能有一个带有string 参数和不同返回类型的完全其他方法。

非常几个表达式包含动态值但仍然没有dynamic的结果类型。在我的脑海中,他们是:

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

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

【讨论】:

  • ...这是避免dynamic的充分理由。
猜你喜欢
  • 1970-01-01
  • 2013-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-28
  • 2014-09-14
  • 1970-01-01
相关资源
最近更新 更多