我想在一个Spectre.Console控制台应用程序中使用F#。我正在尝试将引言示例从C#转换为F#。以下是我的尝试:
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)不幸的是,我得到了以下编译器错误:
The type 'AddPackageCommand' is not compatible with the type 'ICommandLimiter<AddSettings>'

谢谢你的帮助。
发布于 2021-09-28 14:33:51
我是如何解决这个问题的:
interface ICommandLimiter<AddSettings>添加到在来自AddSettings的设置中使用继承的Command子类中。AddBranch调用,仅通过注释IConfigurator的类型:config.AddBranch("add", fun (add: IConfigurator<AddSettings>) -> ...来推断泛型参数。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)https://stackoverflow.com/questions/69363591
复制相似问题