无法将vb转换为c#类

时间:2013-10-17 15:51:10

标签: c# vb.net code-conversion

好的,我在这里做错了什么?我正在尝试将一些vb内容重写为c#(所以我可以学习一些c#),但是我的失败很糟糕。

以下是代码,我将发布之后发生的事情:

private object[] _PNs;
internal object[] ParameterNames { set { _PNs = value; } }

private object[] _PVs;
internal object[] ParameterValues { set { _PVs = value; } }

private Enumerations.DataType[] _DTs;
internal Enumerations.DataType[] ParameterDataTypes { set { _DTs = value; } }


protected void PrepareParams(SqlCommand objCmd)
{
    try
    {
        long _DataSize = 0;
        int _PCt = _PVs.GetUpperBound(0);
        Type _t_dt = _DTs.GetType();
        for (int i = 0; i <= _PCt; ++i)
        {
            if (_t_dt.IsArray)
            {
                switch (_DTs[i])
                {
                    case 0:
                    case 33:
                    case 6:
                    case 9:
                    case 13:
                    case 19:
                        _DataSize = 8;
                        break;
                    case 1:
                    case 3:
                    case 7:
                    case 10:
                    case 12:
                    case 21:
                    case 22:
                    case 23:
                    case 25:
                        _DataSize = Strings.Len(_PVs[i]);
                        break;
                    case 2:
                    case 20:
                        _DataSize = 1;
                        break;
                    case 5:
                        _DataSize = 17;
                        break;
                    case 8:
                    case 17:
                    case 15:
                        _DataSize = 4;
                        break;
                    case 14:
                        _DataSize = 16;
                        break;
                    case 31:
                        _DataSize = 3;
                        break;
                    case 32:
                        _DataSize = 5;
                        break;
                    case 16:
                        _DataSize = 2;
                        break;
                    case 15:
                        break;
                }
                // here
                objCmd.Parameters.Add(_PNs[i], _DTs[i], _DataSize).Value = _PVs[i]; 
            }
            else
            {
                // here
                objCmd.Parameters.AddWithValue(_PNs[i], _PVs[i]);
            }
        }
        _PNs = null;
        _PVs = null;
        _DTs = null;
    }
    catch (Exception ex)
    {
    }
}

编辑:根据我现在得到的答案中的建议:Cannot implicitly convert int to ...DataTypeHas some invalid arguments Parameter.Add方法

所以我假设我的类属性声明不正确。

我该如何解决这个问题?

这是原始的VB代码:

Protected Friend WriteOnly Property ParameterNames() As Object
    Set(ByVal value As Object)
        _PNs = value
    End Set
End Property
Private _PNs As Object

Protected Friend WriteOnly Property ParameterValues() As Object
    Set(ByVal value As Object)
        _PVs = value
    End Set
End Property
Private _PVs As Object

Protected Friend WriteOnly Property ParameterDataTypes() As DataType()
    Set(ByVal value As DataType())
        _DTs = value
    End Set
End Property
Private _DTs As DataType()


Private Sub PrepareParams(ByVal objCmd As Object)
    Try
        Dim _DataSize As Long
        Dim _PCt As Integer = _PVs.GetUpperBound(0)
        For i = 0 To _PCt
            If IsArray(_DTs) Then
                Select Case _DTs(i)
                    Case 0, 33, 6, 9, 13, 19
                        _DataSize = 8
                    Case 1, 3, 7, 10, 12, 21, 22, 23, 25
                        _DataSize = Len(_PVs(i))
                    Case 2, 20
                        _DataSize = 1
                    Case 5
                        _DataSize = 17
                    Case 8, 17, 15
                        _DataSize = 4
                    Case 14
                        _DataSize = 16
                    Case 31
                        _DataSize = 3
                    Case 32
                        _DataSize = 5
                    Case 16
                        _DataSize = 2
                    Case 15
                End Select
                objCmd.Parameters.Add(_PNs(i), _DTs(i), _DataSize).Value = _PVs(i)
            Else
                objCmd.Parameters.AddWithValue(_PNs(i), _PVs(i))
            End If
        Next
        Erase _PNs : Erase _PVs : Erase _DTs
    Catch ex As Exception

    End Try
End Sub

4 个答案:

答案 0 :(得分:6)

C#中的数组访问使用大括号[]而不是括号()

如果该标识符是一个被调用的方法,则打开括号只会跟随C#中的标识符,这就是为什么你会收到无法找到这些方法的错误。

答案 1 :(得分:3)

在c#中,要访问数组或集合的元素,请使用方括号表示法[n],其中n是索引。

因此_DTs(i)变为_DTs[i]

答案 2 :(得分:2)

_DTs(i)应为_DTs [i]

VB对数组使用(),C#使用[]

答案 3 :(得分:0)

我希望你在VB端代码上没有Option Explicit,这意味着编译器会为你“输入”一些cast / CType语句。

当您切换枚举时,您需要将枚举“名称”与未明确表示的数字进行比较,即如果您获得:

'无法将类型'int'隐式转换为'DataType'。存在显式转换(您是否错过了演员?)'

如果你想在很大程度上将代码保持为明确地将其转换为int,即:

 switch  ((int)_DTs[i])

或者与枚举值进行比较,即:

public enum DataType  { bah, hum }

需求

case DataType.bah:
case DataType.hum:
如果你想与数字进行比较,你必须打开((int)_DTs [i])