好的,我在这里做错了什么?我正在尝试将一些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 ...DataType
和Has 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
答案 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])