IEnumerable 表达式体成员 C#

IEnumerable Expression-Bodied Member C#

我在 C# 中有一个只获取 属性,returns 一个 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:"The name 'yield' does not exist in the current context"。 yielding 表达式主体成员在 C#6 中甚至可能吗?在 C#7 中怎么样?

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

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

表达式体 functions/properties 不能有语句...你不能,例如:

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 page, New Language Features in C# 6

2.1 Expression bodies on method-like members Methods as well as user-defined operators and conversions can be given an expression body by use of the “lambda arrow”:

The effect is exactly the same as if the methods had had a block body with a single return statement.

For void returning methods – and Task returning async methods – the arrow syntax still applies, but the expression following the arrow must be a statement expression (just as is the rule for lambdas):

所以void返回方法有一个例外,但它仍然只涵盖调用方法(你可以=> Console.WriteLine("Hello");但你不能=> if ())。