可能的重复:
VB.NET 中的产量

在 C# 中,当编写一个返回值的函数时 IEnumerble<>, , 您可以使用 yield return 返回枚举的单个项目并且 yield break; 表示没有剩余项目。执行相同操作的 VB.NET 语法是什么?

一个例子来自 书呆子晚餐 代码:

public IEnumerable<RuleViolation> GetRuleViolations() {

   if (String.IsNullOrEmpty(Title))
       yield return new RuleViolation("Title required","Title");

   if (String.IsNullOrEmpty(Description))
       yield return new RuleViolation("Description required","Description");

   if (String.IsNullOrEmpty(HostedBy))
       yield return new RuleViolation("HostedBy required", "HostedBy");

   if (String.IsNullOrEmpty(Address))
       yield return new RuleViolation("Address required", "Address");

   if (String.IsNullOrEmpty(Country))
       yield return new RuleViolation("Country required", "Country");

   if (String.IsNullOrEmpty(ContactPhone))
       yield return new RuleViolation("Phone# required", "ContactPhone");

   if (!PhoneValidator.IsValidNumber(ContactPhone, Country))
       yield return new RuleViolation("Phone# does not match country", "ContactPhone");

   yield break;
}

将 C# 转换为 VB.NET 工具 给出“YieldStatement 不受支持”错误。

有帮助吗?

解决方案

目前,从语言语法层面来看,VB.Net 中还没有与 C# 的yield return 等效的方法。

然而,Bill McCarthy 最近在 MSDN 杂志上发表了一篇关于如何在 VB.Net 9.0 中实现类似模式的文章

其他提示

在新的异步CTP 包括用于VB.NET Yield支持

请参阅迭代中对使用信息的Visual Basic

在这里查看我的答案:

总结一下:
VB.Net 没有yield,但 C# 通过将代码转换为幕后的状态机来实现yield。VB.Net的 Static 关键字还允许您在函数中存储状态,因此理论上您应该能够实现一个类,该类允许您在用作函数时编写类似的代码 Static 方法的成员。

在VB.NET没有屈服返回:( 只需创建一个列表,并返回。

在幕后,编译器创建的枚举类做的工作。因为VB.NET没有实现这种模式,你必须创建自己的实现了IEnumerator(Of T)已

下面给出的输出:2,4,8,16,32

在VB,

Public Shared Function setofNumbers() As Integer()

    Dim counter As Integer = 0
    Dim results As New List(Of Integer)
    Dim result As Integer = 1
    While counter < 5
        result = result * 2
        results.Add(result)
        counter += 1
    End While
    Return results.ToArray()
End Function

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    For Each i As Integer In setofNumbers()
        MessageBox.Show(i)
    Next
End Sub

在C#

   private void Form1_Load(object sender, EventArgs e)
    {
        foreach (int i in setofNumbers())
        {
            MessageBox.Show(i.ToString());
        }
    }

    public static IEnumerable<int> setofNumbers()
    {
        int counter=0;
        //List<int> results = new List<int>();
        int result=1;
        while (counter < 5)
        {
          result = result * 2;
          counter += 1;
          yield return result;
        }
    }
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top