这里有两个可供考虑的选项,具体取决于您是否使用 Clojure 的核心数据结构。
从 LINQ将 seq 转换为IEnumerable<string>
withEnumerable.Cast
此选项适用于IEnumerable
仅包含字符串的任何内容。
(defn spit-lines [^String filename a-seq]
(->> a-seq
(System.Linq.Enumerable/Cast (type-args System.String))
(System.IO.File/WriteAllLines filename)))
键入提示以强制调用者提供IEnumerable<string>
如果您想使用类型提示,请执行此操作。但是要注意,clojure 数据结构没有实现IEnumerable<String>
,所以这可能会导致运行时异常。
^|System.Collections.Generic.IEnumerable`1[System.String]|
将类型的完整 CLR 名称包装在垂直管道 ( |
) 中,可以指定在 Clojure 语法中非法的字符。
(defn spit-lines [^String filename ^|System.Collections.Generic.IEnumerable`1[System.String]| enumerable-of-string]
(System.IO.File/WriteAllLines filename enumerable-of-string))
(spit-lines "filename.txt" #{})
这是将集合传递给类型提示版本时的异常:
System.InvalidCastException:无法将“clojure.lang.PersistentTreeSet”类型的对象转换为“System.Collections.Generic.IEnumerable`1[System.String]”类型。
有关指定类型的更多信息。