我在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开发人员相关。
无论如何,提前感谢您的想法!
答案 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 page,New Language Features in C# 6:
2.1类似方法成员的表达式主体 方法以及用户定义的运算符和转换可以通过使用“lambda箭头”给出表达式主体:
效果与方法的块体具有单个return语句完全相同。
对于void返回方法 - 和Task返回异步方法 - 箭头语法仍然适用,但是 箭头后面的表达式必须是语句表达式(就像lambdas的规则一样):
因此void
返回方法有例外,但它仍然只包含调用方法(您可以=> Console.WriteLine("Hello");
但不能=> if ()
)。