2013-04-06 52 views
1

我得到的ClojureCLR REPL编译器例外基本胁迫:ClojureCLR强制错误

=> (class 12) 
System.Int64 

=> (class 12.34) 
System.Double 

=> (class (new System.Double 12)) 
CompilerException System.InvalidOperationException: No constructor in type: Double with 1 arguments 
at clojure.lang.CljCompiler.Ast.NewExpr.ComputeCtor() in D:\work\clojure-clr-1.4.1-fix\Clojure\Clojure\CljCompiler\Ast\NewExpr.cs:line 73 
at clojure.lang.CljCompiler.Ast.NewExpr..ctor(Type type, List`1 args, IPersistentMap spanMap) in D:\work\clojure-clr-1.4.1-fix\Clojure\Clojure\CljCompiler\Ast\NewExpr.cs:line 49 
at clojure.lang.CljCompiler.Ast.NewExpr.Parser.Parse(ParserContext pcon, Object frm) in D:\work\clojure-clr-1.4.1-fix\Clojure\Clojure\CljCompiler\Ast\NewExpr.cs:line 117 
at clojure.lang.Compiler.AnalyzeSeq(ParserContext pcon, ISeq form, String name) in D:\work\clojure-clr-1.4.1-fix\Clojure\Clojure\CljCompiler\Compiler.cs:line 1560, compiling: (NO_SOURCE_PATH:60) 

很抱歉,如果这是一个newbish问题,但行为不一样Java的互操作!

.NET的语法不同吗?

回答

1

ClojureCLR中的互操作性与Clojure中的互操作性非常相似,但平台差异确实显示出来。

java.lang.Double是一个非常不同的生物比System.Double。 JVM的Double是一个与原始double值不同的包装类。 CLR的Double实际上是原始双值的类。 j.l.Double有许多方法在S.Double中并不相同。重新举个例子:j.l.Double有几个构造函数; S.Double没有。为了完成你想要什么,用clojure.core /双:

user=> (class (double 2)) 
System.Double 

Java包装类型碰上平台的差异可能的地方:CLR没有明确的包装类型。我不知道有哪个地方试图详细说明这一点。

有关如何处理不在JVM中的事情的提示(如by-ref参数,枚举等),请查看the wiki on the github repo for ClojureCLR

+0

非常感谢大家的迅速回复。由此我认为,尽可能使用核心Clojure函数进行类型强制更安全。我想这也会让代码更容易在CLR和JVM之间移植? – user2251223 2013-04-07 06:33:35