我刚刚在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#类库中的类型,但我确实得到了以下编译器错误:
控制器/ProviderController.cs(4,53):错误CS0234:命名空间'App.Api‘中不存在类型或名称空间名称’App.Api‘(您缺少程序集引用吗?)/app/src/其他路径Api/File.csproj控制器/ProviderController.cs(22,28):错误CS0246:无法找到类型或命名空间名称'Provider’(您是否缺少了使用指令或程序集引用的/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#中定义的类型的intellisense。如前所述,构建也失败了。在F# netcoreapp3.1项目中使用C#类型有什么遗漏?
Dto.fs项目中的F#文件:
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#控制台应用程序的项目时,我也遇到了同样的问题。
发布于 2020-11-04 09:41:55
正如斯拉克所指出的那样:
最初需要考虑的是,Api.Types.Dto是顶级的module,而不是namespace --这是在隐式地使用名称空间Api.Types并将Dto模块添加到其中。
因此,C#将Dto视为一种类型,而不是可以打开的命名空间--而内部类型(如Provider )对C#来说只是嵌套类型。
这里有两个解析路径:第一个是打开名称空间:using Api.Types,然后点入嵌套类型:Dto.Provider
第二种是using static Api.Types.Dto
https://stackoverflow.com/questions/64672130
复制相似问题