我有一個實作 IEnumerable 的類。它包含一個 GetEnumerator() 方法和一個實作 IEnumerator 的私有類。該類的 Current() 方法回傳一個 KeyValuePair 物件,即(為清楚起見省略了一些代碼)
internal sealed class BlockSheet : IEnumerable
{
public IEnumerator GetEnumerator ()
{
return new BlockSheetEnumerator (this);
}
private class BlockSheetEnumerator : IEnumerator
{
public object Current
{
get
{
KeyValuePair<Point, Actor> pair = (KeyValuePair<Point, Actor>)this.enumerator.Current;
return pair;
}
}
}
}
如果我按以下方式呼叫,這可以正常作業
foreach (KeyValuePair<Point, Actor> unit in blocksheet)
但是如果我嘗試使用隱式 KeyValuePair 解構函式并撰寫
foreach ((Point coordinate, Actor actor) in blocksheet)
然后我得到兩個錯誤:
錯誤 CS1061:“物件”不包含“解構”的定義,并且找不到接受“物件”型別的第一個引數的可訪問擴展方法“解構”(您是否缺少 using 指令或程式集參考?)(CS1061 )
錯誤 CS8129:沒有找到適合型別“物件”的“解構”實體或擴展方法,具有 2 個輸出引數和 void 回傳型別。(CS8129)
(例如,這與 KeyValuePair<> 結構的解構方法在哪里?但我認為這不適用 - 見下文)
我原以為我會“免費”獲得解構器。我嘗試向 BlockSheet 類和 BlockSheetEnumerator 類添加 Deconstruct 方法,但沒有效果(我覺得這沒有意義,因為這兩個類都沒有被解構)。
我的目標是 .NET 5 和 C# 9,使用 Visual Studio 2019 for Mac 版本 8.10.22(內部版本 11)。當然,我已經成功地將解構器與一個字典物件一起使用,以向自己證明這與語言/.NET 版本無關。
uj5u.com熱心網友回復:
IEnumerable意思是“s的集合Object”。因此,在回圈內部,您object在每次迭代中都得到了一個,并且您實際上嘗試解構物件,而不是KeyValuePair<TKey, TValue>. 而且您沒有合適的解構器用于object.
要使用解構,您需要顯式和具體的型別。為此,您可以:
IEnumerable<KeyValuePair<Point, Actor>>/IEnumerator<KeyValuePair<Point, Actor>>為您的物件實施BlockSheet。順便說一句,IEnumerable<T>實作泛型后,您可以通過泛型輕松實作非IEnumerable泛型。只需使用演員表
foreach (var (key,val) in blocksheet.Cast<KeyValuePair<Point, Actor>>()){/*loop body*/}。但這對我來說似乎不是最佳選擇。你也可以實作
DeconstructforObject,但你應該弄清楚它應該如何處理物件,而不是期望KeyValuePair的,所以我強烈不推薦這種方式public static class Ext { public static void Deconstruct(this Object obj, out Point a, out Actor b) { if(obj is KeyValuePair<Point, Actor> pair) { (a,b)=pair; } else { a=null; b=null; // what can we do here? } } }
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/476104.html
