IEnumerable Expression-Bodied Member C#

时间:2017-03-16 14:32:30

标签: c# ienumerable c#-6.0 yield-return c#-7.0

我在C#中有一个get-only属性,返回IEnumerable。如果该属性只会产生一次,那么我可以像这样定义我的属性:

public IEnumerable Derp {
    get { yield return new SomeObject(); }
}

但是我如何使用C#6表达身体的成员呢?以下方法执行 NOT 工作:

// These definitions do NOT work
public IEnumerable Derp => yield return new SomeObject();
public IEnumerable Derp => yield new SomeObject();

返回编译器错误CS0103:"名称' yield'在当前上下文中不存在"。在C#6中,yield表达身体的成员是否可能?在C#7怎么样?

我知道只返回一次的IEnumerable成员看起来很臭,但我主要只是好奇。我在尝试使用NUnit TestCaseSource API时遇到了这种情况,试图提供一种只产生一个测试用例的方法。我还可以看到这与想要定义一个使用StartCoroutine()调用的表达式身体方法的Unity开发人员相关。

无论如何,提前感谢您的想法!

1 个答案:

答案 0 :(得分:11)

Expression-bodied函数/属性不能包含语句......例如:

static int Test(int x) => if (x > 0) x else 0;

甚至

static int Test(int x) => return x;

yield是一个声明......你不能使用它: - )

请注意,您可以:

IEnumerable<SomeObject> Derp => new[] { new SomeObject() };

来自Roslyn github pageNew Language Features in C# 6

  

2.1类似方法成员的表达式主体   方法以及用户定义的运算符和转换可以通过使用“lambda箭头”给出表达式主体:

     

效果与方法的块体具有单个return语句完全相同。

     

对于void返回方法 - 和Task返回异步方法 - 箭头语法仍然适用,但是   箭头后面的表达式必须是语句表达式(就像lambdas的规则一样):

因此void返回方法有例外,但它仍然只包含调用方法(您可以=> Console.WriteLine("Hello");但不能=> if ())。