参数化 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);
}
具体来说,我正在使用 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);
}