首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将spectre.Console的介绍示例转换为F#

将spectre.Console的介绍示例转换为F#
EN

Stack Overflow用户
提问于 2021-09-28 14:26:40
回答 1查看 322关注 0票数 2

我想在一个Spectre.Console控制台应用程序中使用F#。我正在尝试将引言示例从C#转换为F#。以下是我的尝试:

代码语言:javascript
复制
open System

open Spectre.Console.Cli

type AddSettings() =
    inherit CommandSettings()

    [<CommandArgument(0, "[PROJECT]")>]
    member val Project = "" with get, set

type AddPackageSettings() =
    inherit AddSettings()

    [<CommandArgument(0, "<PACKAGE_NAME>")>]
    member val PackageName = "" with get, set

    [<CommandOption("-v|--version <VERSION>")>]
    member val Version = "" with get, set

 type AddReferenceSettings() =
    inherit AddSettings()

    [<CommandArgument(0, "<PROJECT_REFERENCE>")>]
    member val ProjectReference = "" with get, set

type AddPackageCommand() =
    inherit Command<AddPackageSettings>()

    override _.Execute (context,  settings) = 0

type AddReferenceCommand() =
    inherit Command<AddReferenceSettings>()

    override _.Execute(context, settings) = 0


// Define a function to construct a message to print
let from whom =
    sprintf "from %s" whom

[<EntryPoint>]
let main argv =
    let message = from "F#" // Call the function
    let app = CommandApp()

    app.Configure(fun config ->
        config.AddBranch<AddSettings>("add", fun add ->
            add.AddCommand<AddPackageCommand>("package")
            add.AddCommand<AddReferenceCommand>("reference")
        )
    )

    app.Run(argv)

不幸的是,我得到了以下编译器错误:

代码语言:javascript
复制
The type 'AddPackageCommand' is not compatible with the type 'ICommandLimiter<AddSettings>'

谢谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-28 14:33:51

我是如何解决这个问题的:

  1. 显式地将interface ICommandLimiter<AddSettings>添加到在来自AddSettings的设置中使用继承的Command子类中。
  2. 更改AddBranch调用,仅通过注释IConfigurator的类型:config.AddBranch("add", fun (add: IConfigurator<AddSettings>) -> ...来推断泛型参数。
代码语言:javascript
复制
open System

open Spectre.Console.Cli

type AddSettings() =
    inherit CommandSettings()

    [<CommandArgument(0, "[PROJECT]")>]
    member val Project = "" with get, set

type AddPackageSettings() =
    inherit AddSettings()

    [<CommandArgument(0, "<PACKAGE_NAME>")>]
    member val PackageName = "" with get, set

    [<CommandOption("-v|--version <VERSION>")>]
    member val Version = "" with get, set

 type AddReferenceSettings() =
    inherit AddSettings()

    [<CommandArgument(0, "<PROJECT_REFERENCE>")>]
    member val ProjectReference = "" with get, set

type AddPackageCommand() =
    inherit Command<AddPackageSettings>()

    interface ICommandLimiter<AddSettings>

    override _.Execute (context,  settings) = 0

type AddReferenceCommand() =
    inherit Command<AddReferenceSettings>()

    interface ICommandLimiter<AddSettings>

    override _.Execute(context, settings) = 0


// Define a function to construct a message to print
let from whom =
    sprintf "from %s" whom

[<EntryPoint>]
let main argv =
    let message = from "F#" // Call the function
    let app = CommandApp()

    app.Configure(fun config ->
        config.AddBranch("add", fun (add: IConfigurator<AddSettings>) ->
            add.AddCommand<AddPackageCommand>("package") |> ignore
            add.AddCommand<AddReferenceCommand>("reference") |> ignore
        )
    )

    app.Run(argv)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69363591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档