参数化 return 类型是否需要泛型方法签名?

Does a parameterized return type require a generic method signature?

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

我定义了一个接口 ITransformation,方法 ApplyFrom 接受一个 Image 和 returns 一个 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() 方法绑定到特定颜色或深度

需要使用上面的通用、冗长的第一个版本吗?

还是我错过了两个版本之间的一些可能的中间地带?

Do I need to use the generic, verbose first version above?

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

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

关于减少冗长(并仍然保持函数通用)的唯一方法是缩短通用参数名称:

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

您失去了泛型参数的自记录性质,但对编译器来说没有区别。

I don't want to bind the ApplyFrom() method to a specific color or depth

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

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

您可以使方法更短,但代价是使接口通用(因此更冗长)。

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