Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Func<;T、 TResult>;F中的性质#_C#_F# - Fatal编程技术网

C# Func<;T、 TResult>;F中的性质#

C# Func<;T、 TResult>;F中的性质#,c#,f#,C#,F#,我目前正在与来自F的C代码进行互操作 在F#中是否可以定义一个在C#中如下所示的属性 私有函数OnIssatifiedByProperty{get;set;} (在F#中,它不必是Func,而是一个等价物。)我认为等价物应该是 type test() = member val private OnIsSatisfiedByProperty:PropertyInfo -> bool = (fun _ -> true) with get,set;; 如果需要与C#

我目前正在与来自F的C代码进行互操作

在F#中是否可以定义一个在C#中如下所示的属性


私有函数OnIssatifiedByProperty{get;set;}


(在F#中,它不必是
Func
,而是一个等价物。)

我认为等价物应该是

type test() = 
        member val private OnIsSatisfiedByProperty:PropertyInfo -> bool = (fun _ -> true) with get,set;;

如果需要与C#中的类型进行互操作,则需要将其定义为
Func
,而不是
FSharpFunc
,后者具有额外的元数据,例如非
null
规定[如我前面的评论和@John Palmer的答案所示]。因此,可以使用对象初始值设定项初始化的最短类似实际等效值为:

type MyType()=
    member val public OnIsSatisfiedByProperty : Func<PropertyInfo,bool> = null with get,set
type MyType()=
成员val public onissatifiedbyproperty:Func=null,带get,set
或者你可以走以下路线:

type MyType()=
    [<DefaultValue()>]val mutable OnIsSatisfiedByProperty : Func<System.Reflection.PropertyInfo,bool> 
type MyType()=
[]val可变OnIssatifiedByProperty:Func
但在这种情况下,我的快速混乱让我需要执行显式的set/get方法


(顺便说一句,我知道这个答案只是因为几分钟前,
fixture.Inject(fun()->!value)
fixture.Inject(fun()->!value)
)的工作方式不一样。

还有其他信息吗?i、 e.这真的是
受保护的
还是
公共的
?您是否在F#中声明将从C#使用的接口?您将如何初始化它?有一个实际的getter或setter方法重要吗?你在乎那个设定者有一个保护条款吗?在没有进一步上下文的情况下,我的默认答案是
让private mutable onissatifiedbyproperty:(PropertyInfo->bool)option=None
。然后可以使用
Option.iter
等删除空检查。或者,您可以将其作为主构造函数arg:
类型X(?OnIssatifiedByProperty)=…
,如果不存在可变性value@RubenBartelink它可以声明为内部,但在我的场景中这并不重要。它实际上是一种测试类型。该值可以使用构造函数注入提供,但对于此类测试类型,我通常使用对象初始值设定项,我们是否可以假设您是在F#中声明测试类型,然后需要它从C#进行初始化,因此这不是“可能是”
内部的问题
——您需要它是
公共的
/
内部的
,而不是
私有的
?如果是这样,静态类型就变得非常重要@John Palmer的回答(以及我的评论)创建了一个
FSharpFunc
,因此他的扭曲必须初始化。测试类型在F#中定义,并将从F#中使用。设计是C#ish(我还有一个C#的工作示例,因此是最初的互操作性)-现在我首先遵循OO设计,以确保测试通过,然后,我认为,我将慢慢转向一个更具FP性的范例。足够公平-最终,如果你需要/想要一个公共setter,那么
val
就是最好的选择。但我希望转向
类型测试(OnIssatifiedByProperty?=
结构,以便能够依靠
选项
*-obv这取决于您真正的互操作需求的确切性质。考虑到以下几点,这似乎是可行的。我试图应用您提供的代码段,但代码没有编译…:/@NikosBaxevanis稍后会看的。不能说我测试了它们或对它们进行了检测,但没有波形,FSI对它们进行了处理……)@NikosBaxevanis如果您谈论的是不应用
函数
,那么您需要在末尾调用
。。。但我想如果它以另一种方式工作,就会有def pros(因此我的+1)。我想cinst ILSpy应该告诉你你需要知道的一切。哦,我明白了:)没问题。非常感谢你的帮助。我设置为已接受,因为它与我现有的要点一起开箱即用。@NikosBaxevanis是的,这很公平-如果你不需要将内容作为Func公开,那么就没有必要了。很好,你已经解决了…非常感谢你的帮助。这似乎是开箱即用的:)