我可以在 VB.NET 中实现 IEnumerable 函数的收益返回吗?[复制]
-
22-08-2019 - |
题
可能的重复:
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
支持
在这里查看我的答案:
总结一下:
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;
}
}
不隶属于 StackOverflow