【问题标题】:C# project reference F# class lib in netcoreapp3.1netcoreapp3.1 中的 C# 项目参考 F# 类库
【发布时间】:2020-11-03 23:18:56
【问题描述】:

我刚刚在 F# 中创建了一个简单的类库,其中包含以下 fsproj

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <Compile Include="Dto.fs" />
  </ItemGroup>

</Project>

现在我想在具有以下 csproj 的 C# 项目中引用它:

<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:命名空间“App.Api”中不存在类型或命名空间名称“Types”(您是否缺少程序集引用?) [/app/src /更多路径 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# 控制台应用程序使用该项目时,我确实遇到了同样的问题。

【问题讨论】:

  • C# --> F# 要求您构建 F# 项目才能在 C# 中“看到”它,至少在 Visual Studio 中是这样。那是你的环境吗?
  • 请展示Dto.fs的样子。
  • @Hostel,添加了 dto.fs 文件。
  • @PhillipCarter,在我想之前我没有遇到任何问题。我正在使用代码。 dotnet build 不应该也构建引用的项目。

标签: c# .net f#


【解决方案1】:

如 Slack 所述:
最初的担忧是 Api.Types.Dto 是顶级 module 而不是 namespace - 这是隐式使用命名空间 Api.Types 并向其中添加 Dto 模块。
因此,C# 将 Dto 视为一种类型,而不是可以打开的命名空间 - 而内部类型(例如 Provider)对于 C# 来说就是嵌套类型。

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

【讨论】:

  • 可能是这样的,无论你如何扭曲它,绝对是用户错误:D
猜你喜欢
  • 2011-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多