1

我在 ClojureCLR REPL 中遇到了一个编译器异常,用于基本强制:

=> (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)

抱歉,如果这是一个新问题,但行为与 Java 互操作不同!

.NET 的语法是否不同?

4

1 回答 1

1

ClojureCLR 中的互操作与 Clojure 中的互操作非常相似,但平台差异确实体现出来了。

java.lang.Double 是一个与 System.Double 非常不同的生物。JVM 的 Double 是一个包装类,与原始双精度值类不同。CLR 的 Double 实际上是原始双精度值的类。jlDouble 有许多在 S.Double 中没有并行的方法。关于你的例子: jlDouble 有几个构造函数;S.Double 没有。要完成您想要的,请使用 clojure.core/double:

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

Java 包装器类型很可能会遇到平台差异:CLR 没有明确的包装器类型。我不知道有任何地方试图详细介绍这一点。

有关如何处理不在 JVM 中的 CLR 互操作的提示,例如 by-ref 参数、枚举等,请查看ClojureCLR 的 github 存储库上的 wiki

于 2013-04-06T04:13:42.033 回答