C#项目引用了netcoreapp3.1中的F#类库



我刚刚在F#中创建了一个简单的类库,它具有以下fsproj:

<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<Compile Include="Dto.fs" />
</ItemGroup>
</Project>

现在我想在一个C#项目中引用它,该项目具有以下csproj:

<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Mvc.Versioning" Version="4.2.0" />
<PackageReference Include="Serilog" Version="2.10.0" />
<PackageReference Include="Serilog.AspNetCore" Version="3.4.0" />
<PackageReference Include="Serilog.Sinks.Console" Version="3.1.1" />
<PackageReference Include="Serilog.Sinks.Splunk" Version="3.6.0" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="5.6.3" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..<path><to><file>.fsproj" />
</ItemGroup>
</Project>

在控制器中,我现在尝试引用F#类库中的类型,但我确实得到了以下编译器错误:

Controllers/ProviderController.cs(4,53(:错误CS0234:类型或命名空间名称"Types"在命名空间"App.Api"中不存在(是否缺少程序集引用?([/App/src/ssome more path Api/File.csproj]Controllers/ProviderController.cs(22,28(:错误CS0246:找不到类型或命名空间名称"Provider"(是否缺少using指令或程序集引用?([/homepath.csproj]

实际控制器如下所示:

using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using NamespaceTo.Types.Dto;
namespace Api.Controllers
{
[ApiController]
[Route("[controller]")]
[ApiVersion("1.0")]
public class ProviderController : ControllerBase
{
private readonly ILogger<ProviderController> _logger;
public ProviderController(ILogger<ProviderController> logger)
{
_logger = logger;
}
[HttpGet]
public IEnumerable<Provider> Get()
{
return null;
}
}
}

F#项目似乎根本没有被识别,因为我对F#中定义的类型没有任何了解。生成也会失败,如前所述。在C#netcoreapp3.1项目中使用F#类型缺少什么?

F#项目中的Dto.fs文件:

module Api.Types.Dto
open System
type Provider = {
Id: string
Name: string
Logo: string
}
type Text = {
Short: string
Long: string
}
type ProductTexts = {
Default: Text
Alternatives: Text
}
type ProductAlternative = {
Id: string
IsDefault: bool
Priority: int
ContractLength: int
MonthlyPrice: float
EffectiveRate: float
StartupFee: float
MonthlyFee: float
TotalPrice: float
TotalCost: float
}
type Product = {
Id: string
Name: string
Priority: int
Provider: Provider
Texts: ProductTexts
MinimumAmount: float
MaximumAmount: float
Alternatives: ProductAlternative list
}
type ProductResponse = {
Updated: DateTime
ArticleId: string
Price: float
Currency: string
OperatingChain: string
}
type PaymentOption = {
ArticleIds: string list
Product: Product
}
type PaymentOptionsResponse = PaymentOption list

更新:

当我尝试使用另一个F#控制台应用程序中的项目时,我确实遇到了同样的问题。

如Slack上所述:
最初的问题是Api.Types.Dto是顶级module,而不是namespace-这是隐式使用名称空间Api.Types并向其添加Dto模块。
C#因此将Dto视为一种类型,而不是一个可以打开的名称空间-而像Provider这样的内部类型对C#来说只是嵌套类型。

这里有两条解析路径:第一个是打开名称空间:using Api.Types,然后点入嵌套类型:Dto.Provider
第二个是using static Api.Types.Dto

最新更新