实施IList<T> 在F#
-
22-12-2019 - |
题
我已经看遍了SO和internet,但仍然无法弄清楚我缺少什么以及如何在f#中为这种类型实现泛型IList接口:
type OrCondition() as self =
inherit Condition()
member val Conditions: List<Condition> = new List<Condition>() with get, set
interface IList<Condition> with
member this.Item
with get(index) = self.Conditions.[index]
and set(index)(value) = self.Conditions.[index] <- value
member this.IndexOf item = self.Conditions.IndexOf(item)
member this.Insert(index, item) = self.Conditions.Insert(index, item)
member this.RemoveAt(index) = self.Conditions.RemoveAt(index)
member this.Count with get() = self.Conditions.Count
member this.IsReadOnly with get() = false
member this.Add(item) = self.Conditions.Add(item)
member this.Clear() = self.Conditions.Clear()
member this.Contains(item) = self.Conditions.Contains(item)
member this.CopyTo(conditions, index) = self.Conditions.CopyTo(conditions, index)
member this.Remove(item) = self.Conditions.Remove(item)
member this.GetEnumerator() = (Seq.cast<Condition> self.Conditions).GetEnumerator()
现在编译器抱怨我没有实现集合。不可计数。GetEnumerator()和我知道它,但我真的不知道该怎么做。
更新资料: 最终结果如下。非常感谢先生。加兰。另外,值得指出的是,我只引用了系统。收藏品。通用的,忘了参考系统。Ienumerable的非通用版本驻留时的集合。所以sad ReSharper不支持F#。
open System.Collections
open System.Collections.Generic
type OrCondition() as self =
inherit Condition()
member val Conditions = new List<Condition>() with get, set
interface IList<Condition> with
member this.Item
with get(index) = self.Conditions.[index]
and set(index)(value) = self.Conditions.[index] <- value
member this.IndexOf item = self.Conditions.IndexOf(item)
member this.Insert(index, item) = self.Conditions.Insert(index, item)
member this.RemoveAt(index) = self.Conditions.RemoveAt(index)
member this.Count with get() = self.Conditions.Count
member this.IsReadOnly with get() = false
member this.Add(item) = self.Conditions.Add(item)
member this.Clear() = self.Conditions.Clear()
member this.Contains(item) = self.Conditions.Contains(item)
member this.CopyTo(conditions, index) = self.Conditions.CopyTo(conditions, index)
member this.Remove(item) = self.Conditions.Remove(item)
member this.GetEnumerator() = self.Conditions.GetEnumerator() :> IEnumerator<Condition>
member this.GetEnumerator() = self.Conditions.GetEnumerator() :> IEnumerator
解决方案
这是因为 IList
有两个 GetEnumerator
方法,一个用于 IEnumerable<T>
接口和一个用于非泛型 IEnumerable
界面。
您可以添加此成员来实现 IEnumerable
member this.GetEnumerator() = (this.Conditions :> IEnumerable).GetEnumerator()
其他提示
最简单的方式是
interface System.Collections.IEnumerable with
member this.GetEnumerator() = this.Conditions.GetEnumerator() :> _
. 不隶属于 StackOverflow