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

C# 参数化返回类型是否需要泛型方法签名?,c#,generics,methods,types,emgucv,C#,Generics,Methods,Types,Emgucv,具体地说,我是和你一起工作的 我已经定义了一个接口ITransformation,它使用一个方法ApplyFrom,获取一个图像,并返回一个图像: public interface ITransformation { Image<TColor, TDepth> ApplyFrom<TColor, TDepth>(Image<TColor, TDepth> sourceImage); } 但是VisualStudio抱怨Image需要两个类型参数。我不

具体地说,我是和你一起工作的

我已经定义了一个接口
ITransformation
,它使用一个方法
ApplyFrom
,获取一个
图像
,并返回一个
图像

public interface ITransformation
{
    Image<TColor, TDepth> ApplyFrom<TColor, TDepth>(Image<TColor, TDepth> sourceImage);
}
但是VisualStudio抱怨
Image
需要两个类型参数。我不想将
ApplyFrom()
方法绑定到特定的颜色或深度

我是否需要使用上述通用、详细的第一个版本?

还是我在两个版本之间遗漏了一些可能的中间点?

我需要使用上面的通用、详细的第一个版本吗

是-引用泛型类型时需要指定泛型参数。就像不能将
列表
作为类型引用一样,您需要完全限定泛型参数(
列表
列表
,等等)

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

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

public interface ITransformation
{
    Image<C, D> ApplyFrom<C, D>(Image<C, D> sourceImage);
}
公共接口信息转换
{
图像应用程序来自(图像源图像);
}
您失去了泛型参数的自文档性质,但对编译器来说没有区别

我需要使用上面的通用、详细的第一个版本吗

是-引用泛型类型时需要指定泛型参数。就像不能将
列表
作为类型引用一样,您需要完全限定泛型参数(
列表
列表
,等等)

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

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

public interface ITransformation
{
    Image<C, D> ApplyFrom<C, D>(Image<C, D> sourceImage);
}
公共接口信息转换
{
图像应用程序来自(图像源图像);
}
您失去了泛型参数的自文档性质,但对编译器来说没有区别

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

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

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

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

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


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

您可以使方法更短,但代价是使接口泛型(从而更详细)

公共界面信息,其中T:Image{
T ApplyFrom(T sourceImage);
}

您可以使方法更短,但代价是使接口更通用(从而更详细)

公共界面信息,其中T:Image{
T ApplyFrom(T sourceImage);
}

你能改用
IImage
界面吗?@juharr,这是个好主意。我可以在其他地方这样做,但在这里不行。非常感谢。你能改用
IImage
界面吗?@juharr,这是个好主意。我可以在其他地方这样做,但在这里不行。非常感谢。很好的选择。我以前从未见过
where
子句。它有什么作用?确保仅为图像调用
ITransformation
(例如,不为字符串调用)。如果您不需要它,您甚至可以通过
公共接口ITransformation{t ApplyFrom(t sourceImage);}
注意,此选项阻止使用泛型类型推断。@glorfinel,啊,我想我明白了。因此,在Java中,类似的特性是通用约束语法,如下所示:
method(List)
。是吗?这是相关的,但不是类似的。不过,很难在评论中解释两者的区别。这是一个很好的选择。我以前从未见过
where
子句。它有什么作用?确保仅为图像调用
ITransformation
(例如,不为字符串调用)。如果您不需要它,您甚至可以通过
公共接口ITransformation{t ApplyFrom(t sourceImage);}
注意,此选项阻止使用泛型类型推断。@glorfinel,啊,我想我明白了。因此,在Java中,类似的特性是通用约束语法,如下所示:
method(List)
。是吗?这是相关的,但不是类似的。不过,很难用评论来解释两者的区别。我接受我的命运。谢谢你的详细解释!我对StackOverflow社区印象深刻。我接受我的命运。谢谢你的详细解释!StackOverflow社区给我留下了深刻的印象。
public interface ITransformation<T, TColor, TDepth> where T : Image<TColor, TDepth> {
    T ApplyFrom(T sourceImage);
}