【问题标题】:Converting New With from C# to VB.NET - Compilation Error将 New With 从 C# 转换为 VB.NET - 编译错误
【发布时间】:2011-12-19 18:30:07
【问题描述】:

我在 C# 中有以下代码:

public static ArrayList GetGenders()
{
    return new ArrayList()
    {
        new { Value = 1, Display = "ap" },
        new { Value = 2, Display = "up" }
    };
}

一切正常。但是,当我将其转换为 VB.NET 时:

Public Shared Function GetGenders() As ArrayList
    Return New ArrayList() From { _
        New With { _
            .Value = 1, _
            .Display = "ap" _
        }, _
        New With { _
            .Value = 2, _
            .Display = "up" _
        } _
    }
End Function

我收到以下编译时错误:

BC30205:预期语句结束。

代码有什么问题?

【问题讨论】:

  • 你得到什么错误?什么版本的VB?
  • 定义“它不工作”。你有错误吗?编译时还是运行时?
  • @JohnSaunders:在这里构建List<T> 并非易事。
  • 我的错。没有注意到匿名类型。
  • 我正在使用 .net 2.0 框架

标签: c# asp.net vb.net visual-studio-2005 code-conversion


【解决方案1】:

我的心理调试技能告诉我,您使用的是 VB.Net 2005,does not support anonymous types

【讨论】:

  • s iam 使用 vb.net 2005.so 没有解决方案?
  • 您可以创建一个命名类,也可以使用更高版本。
  • 或使用List(of ListItem)
  • @TimSchmelter:这无助于替换匿名类型。
  • @Slaks:不是所有的匿名类型,但可能是这种特殊情况,他需要一个具有属性Value 和属性Display 的类型。他为什么要创建一个已经存在的新类?
【解决方案2】:

这可能是 2010 年之前的 VB.Net 版本,在这种情况下,FROM 语法不可用(我之前在 developerfusion 转换的一些代码中遇到了同样的问题 - 我从 C# 开始.Net 4 到 .Net 3.5 中的 VB.Net)

以下 2 个阶段的过程应该可以做到 - 尚未找到使其成为单行的方法:

Dim arr() = { _
    New With {.Value = 1, .Display = "ap"}, _
    New With {.Value = 2, .Display = "up"} _
}
return = New ArrayList(arr)

【讨论】:

  • 更正:根据 cmets,这是在 .Net 2 中,在这种情况下,上述匿名类型不可用。但是,我将答案留给其他有FROM问题的用户参考
【解决方案3】:

VB2005 特定的答案涉及创建一个类来保存值,然后用该类的实例填充数组列表。

班级:

Public Class LookupList
    Private m_Value As Integer
    Private m_sDisplay As String

    Public Sub New()
        MyBase.New()
    End Sub
    Public Sub New(ByVal wValue As Integer, ByVal sDisplay As String)
        Me.New()
        Me.Value = wValue
        Me.Display = sDisplay
    End Sub

    Public Property Value() As Integer
        Get
            Return m_Value
        End Get
        Set(ByVal value As Integer)
            m_Value = value
        End Set
    End Property
    Public Property Display() As String
        Get
            Return m_sDisplay
        End Get
        Set(ByVal value As String)
            m_sDisplay = value
        End Set
    End Property
End Class

以及方法:

Public Shared Function GetGenders() As ArrayList
    Dim oList As New ArrayList
    oList.AddRange(New LookupList() {New LookupList(1, "ap"), New LookupList(2, "up")})
    Return oList
End Function

与原始 C# 代码更内联的解决方案是为该类创建一个集合类:

Public Class LookupListCollection
    Inherits System.Collections.Generic.List(Of LookupList)

    Public Sub New()
        MyBase.New()
    End Sub
    Public Sub New(ByVal ParamArray aItems As LookupList())
        Me.New()
        If aItems IsNot Nothing Then
            Me.AddRange(aItems)
        End If
    End Sub

End Class

然后可以称为:

Public Shared Function GetGenders() As LookupListCollection
    Return New LookupListCollection(New LookupList(1, "ap"), New LookupList(2, "up"))
End Function

【讨论】:

    【解决方案4】:
    lista.Add(New InvValorMedio With {.Data_Base = _dataBase, _
                                      .Tipo = item.IdInvTipo, _
                                      .Valor = 0})
    

    【讨论】:

    • 如果这是一个答案,请添加一些描述
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-05
    • 1970-01-01
    相关资源
    最近更新 更多