gpt4 book ai didi

c# - IEnumerable 表达式体成员 C#

转载 作者:太空狗 更新时间:2023-10-29 22:21:31 25 4
gpt4 key购买 nike

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

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

但是我如何使用 C#6 表达式体成员来做到这一点?以下方法有效:

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

返回编译器错误 CS0103:“名称‘yield’在当前上下文中不存在”。 yielding expression-bodied 成员甚至可以在 C#6 中使用吗?在 C#7 中怎么样?

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

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

最佳答案

表达式主体函数/属性不能有语句......你不能,例如:

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 返回方法有一个异常(exception),但它仍然只涵盖调用方法(你可以 => Console.WriteLine("Hello"); 但你不能 => if ()).

关于c# - IEnumerable 表达式体成员 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42837004/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com