【发布时间】: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。