在SO上有一些类似的问题,但我似乎无法找到我正在寻找的东西。
有一个C#库(OpenCVSharp)声明一个像这样的重载方法:
public static void CalcHist(Mat[] images,
int[] channels, InputArray mask,
OutputArray hist, int dims, int[] histSize,
Rangef[] ranges, bool uniform = true, bool accumulate = false)
{
....
}
public static void CalcHist(Mat[] images,
int[] channels, InputArray mask,
OutputArray hist, int dims, int[] histSize,
float[][] ranges, bool uniform = true, bool accumulate = false)
{
....
}
即。仅根据"范围"的类型而变化。参数。
我似乎无法调用此方法,即使使用tupled参数样式,包括可选参数并添加一大堆类型注释:
let images = [|new Mat()|]
let hist = OutputArray.Create(new Mat());
let hdims = [|256|];
let ranges = [| new Rangef(0.f,256.f) |];
Cv2.CalcHist<Mat [] * int [] * InputArray * OutputArray * int * int [] * Rangef [] * bool * bool>
(images,
[|0|],
null,
hist,
1,
hdims,
ranges,
true,
false)
错误是&#34;错误4成员或对象构造函数&#39; CalcHist&#39;从此代码位置无法访问9个参数。方法的所有可访问版本&#39; CalcHist&#39;拿出9个参数&#34;
有什么方法可以用F#调用这个方法吗?
答案 0 :(得分:5)
您选择用于指定参数类型的语法实际上不适用于指定参数类型。该语法用于指定泛型函数或类型的泛型参数:
let imGeneric<'t, 'u> (x: 't, y: 'u) = ...
let callGeneric = imGeneric<int, string> (5, "abc")
但是,当然,大多数情况下,F#编译器可以为您推断泛型参数,因此您不需要经常明确地指定它们:
let imGeneric (x, y) = ...
let callGeneric = imGeneric (5, "abc")
您的Cv2.CalcHist
方法不通用。删除泛型参数,它应该可以正常工作:
Cv2.CalcHist( images, [|0|], null, hist, 1, hdims, ranges, true, false )
上述工作,因为编译器已经知道ranges
具有类型Rangef []
,所以它可以选择正确的重载而无需做任何额外的工作。
但有时真的有必要明确指定某些(或所有)参数的类型。在这些情况下,您可以恰当地指定类型:
Cv2.CalcHist(
images, [|0|], null, hist, 1, hdims,
(ranges : Rangef []),
true, false )
请注意(ranges : Rangef [])
周围的额外括号。没有它们,类型注释不仅适用于ranges
,而且适用于images, [|0|], null, hist, 1, hdims, ranges
的整个元组,这将导致编译时错误,因为这样的元组显然不能具有类型Rangef []
或者,您可以在通话前的任何位置修改值的类型:
let ranges: Rangef [] = getRanges()
Cv2.CalcHist( images, [|0|], null, hist, 1, hdims, ranges, true, false )
这将产生同样的效果。编译器实际上只需要知道类型,它并不关心它的确切定义,只要它在需要它之前。