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"。 yield
ing 表达式主体成员在 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 ()
)。
我在 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"。 yield
ing 表达式主体成员在 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 ()
)。