试图理解 C# 方法的签名

Trying to understand the signature of a C# method

以下内容来自 EMGU CV 文档(摘自 here):

DenseHistogram.Calculate<TDepth> Method (Image<Gray, TDepth>[], 
    Boolean, Image<Gray, Byte>)

以下是实际应用中的示例用法:

dh.Calculate(new Image<Gray, Byte>[] { img[0] }, false, null);

其中 dh 已创建为 DenseHistogram

<TDepth> 的作用是什么(紧接在 Calculate 之后)?它没有在示例代码中使用,但似乎没有引起问题,尽管文档中没有任何内容表明它是可选的。

它是 Calculate 方法的通用 Type 参数,它是 generic method。这是一种可以接受任何 Type 的方法(在这种情况下 - 对于 Image 的第二种类型)。可以推断 Type 的通用方法 - 不需要明确指定。

这是一个非常简单的例子:

string ArrayLength<T>(T[] a)
{
    return a.Length.ToString();
}

并使用:

int[] i = { 1, 2, 3 };
Text = ArrayLength(i);

另一方面,以下内容:

Text = ArrayLength(null);

显示:The type arguments for method 'Test.Form1.Example<T>(T[])' cannot be inferred from the usage.解决方法是使用:

Text = ArrayLength<int>(null);

(当然会在 Length 属性 处抛出 NullReferenceException。)

这是一个 generic type parameter,这就是使该方法通用的原因。

在示例代码中,类型参数被推断出来,即编译器从使用的参数中计算出类型参数必须是什么。不推断类型参数的完整调用将是:

dh.Calculate<Byte>(new Image<Gray, Byte>[] { img[0] }, false, null);