参数化返回类型是否需要通用方法签名?

时间:2015-07-08 18:44:36

标签: c# generics methods types emgucv

具体来说,我正在使用EmguCV's Image type

我已经使用方法ITransformation定义了一个接口ApplyFrom,该方法接受Image并返回Image

public interface ITransformation
{
    Image<TColor, TDepth> ApplyFrom<TColor, TDepth>(Image<TColor, TDepth> sourceImage);
}

但是这对于类型参数来说似乎非常冗长,特别是在使用该方法时。理想情况下,界面看起来像这样:

public interface ITransformation
{
    Image ApplyFrom(Image sourceImage);
}

但Visual Studio抱怨Image需要2个类型参数。我不想将ApplyFrom()方法绑定到特定的颜色或深度

需要使用上面的通用,详细的第一版吗?

或者我错过了两个版本之间可能存在的中间立场?

3 个答案:

答案 0 :(得分:4)

  

我是否需要使用上面的通用,详细的第一版?

是 - 您需要在引用泛型类型时指定通用参数。就像您无法将List作为类型引用一样 - 您需要完全限定通用参数(List<T>List<int>等)。

使用方法时,编译器可能能够推断出通用参数,但声明必须包含你拥有它们的所有三个位置的泛型参数。

关于减少详细程度(并保持函数通用性)的唯一方法是缩短通用参数名称:

public interface ITransformation
{
    Image<C, D> ApplyFrom<C, D>(Image<C, D> sourceImage);
}

您失去了通用参数的自我记录性质,但是对于编译器没有区别。

答案 1 :(得分:1)

  

我不想将ApplyFrom()方法绑定到特定的颜色或深度

这正是泛型的用途。这是为了编写一种方法,在编写此方法时不需要指定那些通用的类型。

这些是你的选择;指定图像使用的确切类型,不允许它们成为任何其他类型,或使方法通用,以便调用者可以提供任何类型的图像作为通用参数。

答案 2 :(得分:1)

您可以缩短方法,但代价是使界面通用(因此更详细)。

public interface ITransformation<T, TColor, TDepth> where T : Image<TColor, TDepth> {
    T ApplyFrom(T sourceImage);
}