【问题标题】:VB.Net to C# conversion errorsVB.Net 到 C# 的转换错误
【发布时间】:2021-08-13 07:10:41
【问题描述】:

我正在从事一项 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# 完全陌生。有人可以帮忙吗?

【问题讨论】:

  • 在VB中应该是Dim strEnvironment as String而不是String strEnvironment
  • Dts.Variables["g_Environment"]
  • @ErrBon,对不起,我的语法错误很糟糕。它只是 Dim strEnvironment As String。我改变了 OP。
  • @Chetan,这有点帮助。我不得不使用 Dts.Variables["g_Environment].ToString(); 感谢您的帮助。

标签: c# vb.net syntax-error


【解决方案1】:

我认为您使用的转换器无法确定 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 []

对于表示集合的类,可能会在 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是一个属性,而不是一个方法

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

【讨论】:

  • 仅供参考,问题是Item 而不是Items(不确定您是指Variables,尽管问题并未表明它是函数还是属性)和@ 987654338@ 是 VB 的自动索引器(有趣的是,您甚至会在反射中看到它)。
【解决方案2】:

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

我有点惊讶转换器不会意识到这一点(或者它会因为调用一个省略空参数列表的函数而感到困惑)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多