【问题标题】:Redim Statement alternative in C#- Code giving errorsC# 中的 Redim 语句替代 - 代码给出错误
【发布时间】:2016-06-30 07:16:18
【问题描述】:

我知道 C# 中没有 Redim 语句。我用 VB 编写了这段旧代码,然后使用 Telerik Tool 将其转换为 C#。现在在线工具遇到Redim语句时给出了一些cmets。 VB代码和C#代码如下。

Public Function ReadMultiCurvedDataFromFile(ByRef filenumber As Short) As ConvexMultiCurveDataType
        Dim i As Short
        Dim OutData As ConvexMultiCurveDataType = InitConvexMultiCurveDataType()
        Try
            With OutData
                FileGet(filenumber, .BlendFactor)
                FileGet(filenumber, .EdgeRadius)
                FileGet(filenumber, .OZShapeFactor)
                FileGet(filenumber, .OZPrismOffset)
                FileGet(filenumber, .NumOzCurves)
                If .NumOzCurves > 0 Then
                    ReDim .OZCurveData(.NumOzCurves - 1)
                    For i = 0 To .NumOzCurves - 1
                        FileGet(filenumber, .OZCurveData(i))
                    Next
                End If
                FileGet(filenumber, .NumLenticularCurves)
                If .NumLenticularCurves > 0 Then
                    ReDim .CurveData(.NumLenticularCurves - 1)
                    For i = 0 To .NumLenticularCurves - 1
                        FileGet(filenumber, .CurveData(i))
                    Next
                End If
            End With
        Catch ex As Exception

        End Try
        Return OutData
    End Function

C# 代码

public static Mold_Power_Suite.Model.ConvexSurfaceStructures.ConvexMultiCurveDataType ReadMultiCurvedDataFromFile(ref short filenumber)
        {
            int filenumber1 = filenumber;
            long i = 0;
            Mold_Power_Suite.Model.ConvexSurfaceStructures.ConvexMultiCurveDataType OutData =ConvexSurfaceStructures. InitConvexMultiCurveDataType();
            try
            {
                var _with30 = OutData;
                FileSystem.FileGet(filenumber,ref _with30.BlendFactor);
                FileSystem.FileGet(filenumber,ref _with30.EdgeRadius);
                FileSystem.FileGet(filenumber,ref _with30.OZShapeFactor);
                FileSystem.FileGet(filenumber, ref _with30.OZPrismOffset);
                FileSystem.FileGet(filenumber,ref _with30.NumOzCurves);

                if (_with30.NumOzCurves > 0)
                {
                    //Array.Resize();
                    // ERROR: Not supported in C#: ReDimStatement

                    for ( i = 0; i <= _with30.NumOzCurves - 1; i++)
                    {

                        FileSystem.FileGet(filenumber1, ref  _with30.OZCurveData[i]); // GETTING MENTIONED ERROR HERE
                    }
                }
                FileSystem.FileGet(filenumber,ref _with30.NumLenticularCurves);
                if (_with30.NumLenticularCurves > 0)
                {
                    // ERROR: Not supported in C#: ReDimStatement

                    for (i = 0; i <= _with30.NumLenticularCurves - 1; i++)
                    {
                        FileSystem.FileGet(filenumber1, ref _with30.CurveData[i]); //GETTING MENTIONED ERROR HERE
                    }
                }

            }
            catch (Exception ex)
            {
            }
            return OutData;
        }

OZCurveData 已被定义为

 Dim OZCurveData() As ConvexOZCurveDataType

ConvexOZCurveDataType

Public Structure ConvexOZCurveDataType
        Dim SphereRadius As Double
        Dim CylRadius As Double
        Dim Diameter As Double
        Dim Addition As Double
    End Structure

我在上述行中遇到错误。错误是

'Microsoft.VisualBasic.FileSystem.FileGet(int, ref System.DateTime, long)' 的最佳重载方法匹配有一些无效参数

Redim 也是一个问题。

【问题讨论】:

  • 参见this关于redim。
  • 你是怎么得到 redim word 下的背景颜色的?
  • 用法Array.Resize(ref array, new size);
  • _with30.CurveData[i]的类型是什么?还有_with30.OZCurveData[i]之一?
  • CurveData 的 exact VB 定义(一直到它所涵盖的原始数据类型)是您问题的本质(比您的代码行更相关)发布)。请将它们包含在您的问题陈述中,不要让评论者一次将这些信息拉出一个问题。

标签: c# vb.net winforms


【解决方案1】:

VB.NET 是“允许的”,因此您可以传递 ByRef 预期的派生类型。在我们的例子中,在 VB 中 FileGet(Integer, ByRef ValueType) 被调用。 C# 不允许这样做,因此您需要创建一个 ValueType 类型的临时对象并将其分配给 OZCurveData/CurveData,然后将其传递给 FileGet,然后分配OZCurveData/CurveData 的临时对象。例如:

ValueType vObj = _with30.OZCurveData[i];
Microsoft.VisualBasic.FileSystem.FileGet(1, ref vObj);
_with30.OZCurveData[i] = (ConvexOZCurveDataType)vObj ;

关于Redim,可以使用Array.Resize(正如@Gaurav Singh Jantwal 所说):

Array.Resize(ref _with30.OZCurveData, _with30.NumOzCurves - 1);

【讨论】:

  • 我需要这条线吗 _with30.OZCurveData[i] = (ConvexOZCurveDataType)vObj ; ?我必须把它放在 FileSystem.FileGet() 之后,在 for 循环里面吗?
  • 是的,如果你不这样做,_with30.OZCurveData[i] 的值不会改变
猜你喜欢
  • 2013-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多