VB.Net为什么需要显式声明我的字典才能使用select?

时间:2019-06-07 21:28:16

标签: vb.net linq

在MVC5中使用VB.Net。

我有字典:

Dim Filter as New Dictionary(Of String, Object)

' the key's value is another dictionary
Filter.Add("customParams", New Dictionary(Of String, String) From {{"k1","v1"}, {"k2","v2"}, {"k3","v3"}})

并且我正在尝试将Filter(“ customParams”)值(它是Dictionary(字符串,字符串))转换为定界字符串,“ k1 = v1,k2 = v2,k3 = v3”

这不起作用:

Dim kvString As String = String.Join(", ", Filter("customParams").Select(Function(x) x.Key & "=" + x.Value).ToArray())

我收到此异常:

  

类型为'Dictionary(Of String,String)'的公共成员'Select'不是   找到。

但是,如果我为Dictionary(Of String,String)显式声明一个新变量,并使用它代替Filter(“ customParams”),则这可行:

Dim customParams As Dictionary(Of String, String) = Filter("customParams")
Dim kvString As String = String.Join(", ", customParams.Select(Function(x) x.Key & "=" + x.Value).ToArray())

为什么它不能以其他方式工作?异常本身说它正在使用Dictionary(Of String,String)

1 个答案:

答案 0 :(得分:2)

默认情况下,VB.Net允许 late binding OPTION STRICT OFF)。后期绑定等效于C#中的dynamic,意味着运行时按名称查找要调用的方法,并且编译器不进行类型检查或验证。后期绑定只能访问公共成员,因此扩展{friend}方法(例如Select)不可用。这对于VB.Net中的object变量是自动的。 customParams具有(非object)分配的类型,因此使用早期绑定。