VB.Net 到 C# 的转换错误

VB.Net to C# conversion errors

我正在处理一个 SSIS 作业,它在 VB.Net 中有一个脚本任务。我们的组织指令是在漫长的 运行 中转向 C#。对于我正在开发的新 SSIS 作业,我使用了在线 VB.Net 到 C# 转换器并将其用于脚本任务。读取变量的 VB.Net 语句在 C# 中具有类似的语法,但会抛出一条错误消息。下面是 VB.Net 和等效的 C# 代码。

VB.Net 语句:

Dim strEnvironment As String = Dts.Variables.Item("g_Environment").Value.ToString()

C# 语句:

String strEnvironment = Dts.Variables.Item("g_Environment").Value.ToString()

如您所见,在变量中存储值的语句在 VB.Net 和 C# 中是相同的。但是,当我在 SSIS 作业的脚本任务中使用此代码时,C# 代码会标记以下错误消息。

'Variables' does not contain a definition of 'Item' and no accessible extension method 'Item' accepting a first argument of type 'Variables' could be found (Are you missing a using directive or an assembly reference?). 

我的导入语句如下:

Using System;
Using System.IO;
Using System.text;
Using Sytsem.Collections;
Using System.Data;
Using Microsoft.Visualbasic;
Using Microsoft.SqlServer.Dts.Runtime;

我对 SSIS/VB.Net 和 C# 完全陌生。有人可以帮忙吗?

我认为您使用的转换器无法确定 Item 似乎是默认值 属性,而不是方法(函数,在 vb 术语中),或者它不理解如何将其翻译成 C#

VB 方法和集合(数组)( )

Dim array = "a,b".Split(",")      'method, args are surrounded in ()
Dim a = array(0)                  'indexer also is surrounded in ()

C# 有 ( ) 用于方法,[ ] 用于通过某些索引器访问可索引集合:

var array = "a,b".Split(",");     'method, surrounded by ()
var a = array[0];                 'indexer, surrounded by []

对于表示集合的 classes,可能会在 VB 中提供索引 属性 - 属性(任何名称)标有 Default 即在未指定其他 属性 名称时访问的 属性。在 C# 中,等价的 属性 总是被称为 this 并且您无法选择名称,也不会在索引项目时指定它

你的VB:

Dim strEnvironment As String = Dts.Variables.Item("g_Environment").Value.ToString()

也可能是:

Dim strEnvironment As String = Dts.Variables("g_Environment").Value.ToString()

但是因为它是索引,所以你在 C# 中使用 []:

String strEnvironment = Dts.Variables["g_Environment"].Value.ToString();

顺便说一下,现代 Visual Studio 可以帮助您处理道具与方法:

..方法是黄色的,属性是白色的,局部变量是浅青色的..(但是智能感知中没有任何显示“这东西是可索引的”)

如果你写 .Something(...) 并且看到它是白色的,那么 Something 是一个 属性,而不是一个方法

此外,class 名称是绿色的,暗淡的东西未使用,3 个点表示有可能改进的建议

Item 是 VB 中的索引器。 VB 中 Item(x) 的直接等价物是 C# 中的 [x]

我有点惊讶转换器不会意识到这一点(或者它会被混淆,例如调用一个省略了空参数列表的函数)。

另请参阅此问题以获取有关索引器的更多信息:Create Indexer in VB.NET which can be used from C#