试图理解 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);
以下内容来自 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);