参数化返回类型是否需要泛型方法签名

本文关键字:泛型方法 返回类型 是否 参数 | 更新日期: 2023-09-27 18:01:54

具体来说,我正在使用EmguCV的Image类型。

我定义了一个接口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()方法绑定到特定的颜色或深度

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

或者我错过了两个版本之间可能的中间地带?

参数化返回类型是否需要泛型方法签名

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

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

使用方法时,编译器可以推断出泛型参数,但声明必须在所有三个位置包含泛型参数。

为了减少冗长(同时保持函数的泛型),你唯一能做的就是缩短泛型参数名:
public interface ITransformation
{
    Image<C, D> ApplyFrom<C, D>(Image<C, D> sourceImage);
}

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

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

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

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

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

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