2

我正在使用第三方 API,该 API 相当笨拙地使用 ref 参数来生成输出。就我个人而言,我真的很讨厌这种 API 设计,但这是我现在可以使用的。由于专有代码,我不得不稍微隐藏 API 的数据类型,但这应该与手头的问题无关。

无论如何,在 C# 中,我可以成功地将空引用作为 ref 参数传递,如下所示:

            IDataType tl = null;
            bool success = api.myFunction(ref tl);

但是在 F# 中,以下内容将不起作用

    let mutable tl : IDataType = null //null reference assignment in F#
    let success = api.myFunction(&tl) //& means ref in F#

它返回一个空引用异常错误。在 C# 中不返回此类错误。

有没有人经历过这个?我认为这一定是 API 本身的一个错误,这是一个相对古老的设计。

**编辑:这应该关闭,我相信答案不在于 F# 代码,而在于 API,因为它已经是许多与此类似的已知错误。

4

3 回答 3

5

在 C# 中对 API 进行快速而肮脏的原型设计

namespace API
{
    public interface IDataType { void Hi(); }

    public class API: IDataType {
        public void Hi() { System.Console.WriteLine("Hi!"); }

        public bool MyFunction(ref IDataType iface) {
            iface = new API();
            return true;
        }
    }
}

然后在 F# 中完全按照您的方式使用它,同时保持在同一个 CLR 中:

let mutable iface : API.IDataType = null
if API.API().MyFunction(&iface) then iface.Hi()

工作没有任何问题。

因此,确实,您的问题是特定于您给定的 API 的,与 F# 的使用形式无关。

于 2013-07-18T15:41:11.400 回答
1

在这里使用 ref 单元格也是一个选项。这行得通吗?

let tl = ref null 
let success = api.myFunction(tl)
于 2013-07-18T14:37:55.497 回答
1

问题在于在 .NET 2.0 中编译的 API 在 C# 下运行良好,但在 F# 下运行良好。

于 2013-07-29T08:41:43.273 回答