参数化返回类型是否需要泛型方法签名
本文关键字:泛型方法 返回类型 是否 参数 | 更新日期: 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);
}