【问题标题】:VB.net How do I manually/explicitly convert an array to an ObjectCollection?VB.net 如何手动/显式地将数组转换为 ObjectCollection?
【发布时间】:2015-06-21 23:27:36
【问题描述】:

使用 strict=off (project..project properties..strict=off),我可以做到

Dim Objects As Object = New Object() {"AAA", "BBB"}        
ListBox1.Items.AddRange(Objects)

但如果我执行 strict=on 那么它会告诉我

Error   1   Overload resolution failed because no accessible 'AddRange' can be called with these arguments:
    'Public Sub AddRange(items() As Object)': Option Strict On disallows implicit conversions from 'Object' to '1-dimensional array of Object'.
    'Public Sub AddRange(value As 

System.Windows.Forms.ListBox.ObjectCollection)': Option Strict On disallows implicit conversions from 'Object' to 'System.Windows.Forms.ListBox.ObjectCollection'.   

通常这些转换会在 strict=off 时隐含,当我打开 strict=on 时,编译错误会告诉我将其更改为什么。但在这里它没有任何建议。

我想保持 strict=on(至少为了学习这一点)

如何显式转换它,以免出现编译错误。所以我可以让这两条线与 strict=on 一起工作?

添加说明

我现在看到我错过了括号。所以我会澄清我的问题。问题是这个-

如果我这样做

 Dim nums As Integer = {4, 5, 6, 7}

然后我得到一个编译错误,即使使用 strict=off 它也无法编译它

另一方面

dim obj as Object = {4,5,6,7]

上面的那一行,将使用 strict=off 进行编译,因为即使右侧是一个对象数组,它要么是一个对象,要么可以转换为一个对象。

如果我做 strict=off 那么它就可以工作,所以 VB 正在做一些转换以使其工作。即 true 它不能将整数数组转换为整数。但它可以(似乎)将对象数组转换为对象。

即当编译器看到 Dim nums As Integer = {4, 5, 6, 7} 和 strict=off 时,它并没有说“啊,他错过了括号”并将其转换为昏暗的数字,如 Integer() = {4,5,6,7}。同样,我确信dim object as Object = {3,4,5,6} 不会这样做,但它在对象案例中做了一些事情,以使其工作。它隐含地做到了。

我想看看它是什么,明确地说,我想看看它是什么,编译器会添加到它,做那个转换,让它工作。不管它是什么,它都没有添加括号。

【问题讨论】:

  • 既然包含字符串,为什么不创建一个字符串数组呢? Dim items As String() = {"AAA", "BBB"} 如果是本地声明,则不需要 New Object()
  • @Plutonix 我知道我可以.. 我只是在试验,但我可能应该有。使用 New 和不使用 New 有什么区别,例如它如何影响本地/全局声明?
  • 启用 Option Infer 后,VB 可以从字面量的内容中推断出您的新数组是字符串;表单/模块级别的初始化程序仍然需要它。
  • @Plutonix 问题是我错过了 (),如果我执行 (),那么它会起作用。所以问题是..我会编辑我的问题来澄清这一点。如何将对象转换为对象集合,将对象数组转换为对象?
  • @Plutonix 并且因为它编译时使用 strict=off 并且使用 strict=on 时失败,即使没有 new,所以 new 在这里没有什么区别。但很高兴知道没有必要写new

标签: vb.net casting


【解决方案1】:

只需在 As Object 之后添加括号:

Dim Objects As Object() = New Object() {"AAA", "BBB"}

原因是您将Objects 声明为Object,而不是Objects 的数组。请注意,您也可以这样做:

Dim Objects = New Object() {"AAA", "BBB"}

此外,我建议您遵守命名约定并将变量命名为小写object

Dim objects = New Object() {"AAA", "BBB"}

【讨论】:

  • 谢谢,我已添加括号以正确声明它。但这让我想知道.. 当我使用 strict=off 时,发生了什么隐式转换使 Dim Objects As Object = New Object() {"AAA", "BBB"} 在不带括号的情况下编译?
  • 例如strict=off 是否如此不严格以至于它看到了我的代码,发现我错过了括号并添加了它们?或者,更有可能的是,它是否进行了一些显式转换以使其编译?如果是这样,那么它在做什么转换?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多