代码使用netcore编译,但不会使用mono进行编译

时间:2019-01-29 09:57:29

标签: compiler-errors f# .net-core mono

我正在运行Ubuntu 18.04 LTS,使用的是Mono版本5.18.0.2140,如果我将netcore与VS Code一起使用,我的代码将无法在mono下编译。但是,我需要为该分配使用单声道,所以我不确定出什么问题了。我正在使用的命令是:

fsharpc --nologo chessApp.fsx && mono chessApp.exe

错误发生在代码的这一部分(from this line and down,底部是完整要点):

let playerOne = Chess.Human(Color.White) // Here
let playerTwo = Chess.Human(Color.Black) // Here

let game = new Chess.Game()
game.run(playerOne, playerTwo, board, pieces) // and here

我得到的错误如下:

 chessApp.fsx(28,17): The object constructor 'Human' takes 0 argument(s) but is here given 1. The requried signature is 'new : unit -> Human'.

 chessApp.fsx(29,17): The object constructor 'Human' takes 0 argument(s) but is here given 1. The requried signature is 'new : unit -> Human'.

 chessApp.fsx(31,1): This value is not a function and cannot be applied.

使用VS Code我没有得到这些错误。它在那里工作。例如,Human确实接受了1个参数VS Code上的netcore识别出了这一点,但是mono没有。为了不使这个问题超出需要的时间,我已将代码上传到要旨right here

1 个答案:

答案 0 :(得分:2)

我尝试通过在Windows上从命令行运行编译器来重现此问题。 fsx源文件中有两个小错误。首先,您打开了错误的名称空间:

#r "chess.dll"
#r "pieces.dll"

open Chess
open Pieces // <- This should be open 'Piece'

第二,pieces集合必须是列表,而不是数组:

let pieces =
   [ king (White) :> chessPiece
     rook (White) :> chessPiece
     king (Black) :> chessPiece
     rook (Black) :> chessPiece ]

通过这两个更改,我能够编译所有内容:

fsharpc --target:library chess.fs
fsharpc --target:library -r:chess.dll pieces.fs
fsharpc chessApp.fsx

请注意,您需要--target:library来表明这应该构建一个dll文件,还需要-r:chess.dll来构建第二个文件,以告知它需要引用第一个{{1} }。

如果使用dll将其他两个文件引用为源文件,而不是使用#load作为编译文件,则容易得多:

#r

然后,您只需运行#load "chess.fs" #load "pieces.fs" 就可以编译整个程序,您将获得一个独立的可执行文件。