C# F#类型提供程序是否可以合并到C中#

C# F#类型提供程序是否可以合并到C中#,c#,.net,f#,type-providers,C#,.net,F#,Type Providers,酷炫的新F#3.0功能类型提供程序可用于桥接F#数据类型或类与XML或WSDL等数据源结构之间的不匹配。然而,这种不匹配在其他.NET语言(如C#)中也是一个挑战 我想在C代码中使用F#3.0提供程序。如果有的话,我该怎么做?此外,如果我们不能,C#实现需要什么才能使用它们呢?类型提供程序的工作方式的某些方面特别适合F#程序员的需要,但在考虑其他语言的强类型数据访问解决方案时,可能不那么引人注目。例如,许多F#编程都是在F#Interactive中完成的,与代码生成器(需要一种语言外部机制来生成

酷炫的新F#3.0功能类型提供程序可用于桥接F#数据类型或类与XML或WSDL等数据源结构之间的不匹配。然而,这种不匹配在其他.NET语言(如C#)中也是一个挑战


我想在C代码中使用F#3.0提供程序。如果有的话,我该怎么做?此外,如果我们不能,C#实现需要什么才能使用它们呢?

类型提供程序的工作方式的某些方面特别适合F#程序员的需要,但在考虑其他语言的强类型数据访问解决方案时,可能不那么引人注目。例如,许多F#编程都是在F#Interactive中完成的,与代码生成器(需要一种语言外部机制来生成源代码文件)相比,类型提供程序可以很好地支持此工作流。由于C#程序员习惯于较慢的编辑-编译-运行周期,这在C#设置中可能不太重要

从技术角度来看,我怀疑F#更普及的类型推断可能是与C#等语言相比的最大优势。例如,如果我想将某个类型提供程序中的某些数据访问逻辑包装到另一个类型中,我可以执行以下操作:

let moviesStartingWith prefix =
    query {
        for movie in MyDataSource.Movies do
        where (movie.Title.StartsWith(prefix) }
    |> Seq.toList
在C#中,我需要指定返回类型(例如,
列表
),这最终会成为一件琐事,这意味着即使使用IntelliSense,我也会点选提供的类型集来生成签名,以及点选提供的值集来生成查询


当然,这也适用于类型提供程序以外的区域,但我认为,对于某些提供者自然生成的一些嵌套类型层次结构,这在实践中会特别痛苦,因为类型名称变得非常长。

我认为@kvb很好地概括了一些技术难题。我同意类型推断会有问题——您基本上只能在本地使用提供者生成的类型,类似于匿名类型。我认为C#在Roslyn中可能会有类似的功能,但我怀疑它是否会像F#中那样优雅流畅地集成(在F#中,类型提供程序实际上是语言功能,而不仅仅是工具)

要回答您的两个具体问题:

[如何]在C代码中使用F#3.0提供程序

F#类型提供程序实际上只有F#编译器才能理解,因此您需要从F#使用它们。对于生成型提供程序(SQL、实体、WSDL、配置文件),您可以从F#引用提供程序,并使用从C#项目生成的类型


对于擦除类型提供程序,您将无法执行此操作,因为类型实际上并不存在,只有F#可以看到它们。因此,最好的选择是用F#编写处理代码,并将结果作为记录或其他类型的集合返回,这些记录或类型很容易从C#中使用

C#实现需要什么才能使用它们

当然,我可以说“C#必须支持类型提供者!”,但这里还有一些想法。类型提供程序只是.NET程序集,它们不使用任何特定于F的类型。可以被包括C#在内的任何.NET语言使用,因此如果C#设计人员需要,他们可以重用已经为F#构建的所有优秀提供者


因此,将此建议提交给或在其他地方推广(或说服Mono团队实施此建议!),也许它将添加到C#(
vNext+1+…
)。目前,你只能从F#中获得所有好处。

C#类型推断可能比你想象的要好。即使这是一个方法而不是内联语句,也可以在方法签名上放置一个类型参数,传入
MyDataSource.Movies
将绑定类型参数,而无需指定封闭类型,并保留返回类型
List
。这应该是社区wiki的形式。我相信这会引发相当长的讨论。谢谢你的反馈。我不确定我是否完全理解生成类型提供程序和擦除类型提供程序之间的区别。在哪里可以找到有关此主题的其他信息?我想世界银行类型提供程序就是擦除类型提供程序的一个例子。但是CSV类型的提供者呢。这也是一个擦除类型提供程序吗?“因此,最好的选择是用F#编写处理代码,并将结果作为记录集或其他类型的集合返回,这些记录或类型很容易从C#中使用。”你有任何这方面的代码示例吗?@Nameless我做了一个关于这方面的Pluralsight视频:它实际上在未来2天左右免费提供(但你以后也应该可以得到免费试用)。@TomasPetricek真棒!谢谢你,Tomas!