F#将null引用传递给ref参数

时间:2013-07-18 13:20:42

标签: f# nullreferenceexception

我正在使用第三方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中,因为它已经有许多类似的错误。

3 个答案:

答案 0 :(得分: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;
        }
    }
}

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

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

没有任何问题。

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

答案 1 :(得分:1)

在这里使用ref cell也是一种选择。这有用吗?

let tl = ref null 
let success = api.myFunction(tl)

答案 2 :(得分:1)

问题在于,在.NET 2.0中编译的API在C#下工作正常但不是F#。