簡體   English   中英

IEnumerable Expression-Bodied Member C#

[英]IEnumerable Expression-Bodied Member C#

我在C#中有一個get-only屬性,它返回一個IEnumerable 如果該屬性只會產生一次,那么我可以像這樣定義我的屬性:

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'”。 yield荷蘭國際集團表達健全構件在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頁面C#6中的新語言功能

2.1類方法成員的表達式主體方法以及用戶定義的運算符和轉換可以通過使用“lambda箭頭”給出表達式主體:

效果與方法具有帶有單個return語句的塊體完全相同。

對於void返回方法 - 以及Task返回異步方法 - 箭頭語法仍然適用,但箭頭后面的表達式必須是語句表達式(就像lambdas的規則一樣):

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM