试图理解C#方法的签名

时间:2015-02-16 20:11:11

标签: c# opencv emgucv

以下内容来自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之后)?它没有在示例代码中使用,但似乎没有引起问题,尽管文档中没有任何内容表明它是可选的。

2 个答案:

答案 0 :(得分:2)

这是Type方法的通用Calculate - 参数,它是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);

(当然,它会在NullReferenceException属性上抛出Length。)

答案 1 :(得分:2)

这是generic type parameter,这使得该方法具有通用性。

在示例代码中推断出type参数,即编译器从使用的参数中找出类型参数必须是什么。没有推断出类型参数的完整调用将是:

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