F# 使用作为接口的属性定义类型

F# 使用作为接口的属性定义类型,f#,F#,我正在寻找以下C#代码的功能等价性: 公共虚拟ICollection狗{get;set;} 我一直上下左右和MSDN,无济于事。除此之外,是否有其他属性的构造: let mutable dogID = 0 member public self.DogID with get() = dogID and set(value) = dogID <- value 让可变dogID=0 成员公共self.DogID 使用get()=dogID 和set(value)=dogID

我正在寻找以下C#代码的功能等价性:

公共虚拟ICollection狗{get;set;}
我一直上下左右和MSDN,无济于事。除此之外,是否有其他属性的构造:

let mutable dogID = 0

member public self.DogID
    with get() = dogID
    and set(value) = dogID <- value
让可变dogID=0
成员公共self.DogID
使用get()=dogID

和set(value)=dogID您可以使用自动属性:

member val Dogs = List<Dog>() with get,set 
member val Dogs=List()和get,set

好的,显然我需要做得更好。我发现了这一点,这让我想到:

let mutable dogs = List<DOG>() :> ICollection<DOG> 


member public self.Dogs
    with get() = dogs
    and set(value) = dogs <- value      
let mutable dogs=List():>ICollection
公众自救犬会员
用get()=狗

和set(value)=你期望初始值是多少?您的示例代码很好,您只需要使用
I集合
而不是
0
(这是一个
Int
)作为初始值设定项。我不知道初始值是什么。它将只实现ICollection。如果有人创建了你的类的实例,并在设置它之前检索了
Dogs
属性,他们应该得到什么值?但不是列表,我需要ICollection。当我用ICollection替换List时,编译器会说“接口类型的使用无效”将强制转换添加为显式::>ICollection我在实现C#定义的接口时主要使用这样的自动属性。如果这对您很重要,那么这不会使属性
虚拟。文档说明了如何做到这一点:您没有要求,但我也会强烈地考虑,该集合是否需要是可变的。可变是函数式编程中的一种代码味道——不一定是错误的,但需要认真思考。如果需要将不同的狗集合与之关联,则更可能需要创建新对象。我正在映射回C#中定义的接口。哈哈,这个集合来自实体框架