【问题标题】:Does a parameterized return type require a generic method signature?参数化返回类型是否需要泛型方法签名?
【发布时间】:2015-09-26 20:42:36
【问题描述】:

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

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

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

或者我错过了两个版本之间的一些可能的中间立场?

【问题讨论】:

  • 你能用IImage接口代替吗?
  • @juharr,这是个好主意。我将能够在其他地方做到这一点,但不是在这里。谢谢!

标签: c# generics methods types emgucv


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 我接受我的命运。感谢您的详细解释! StackOverflow C# 社区给我留下了深刻的印象。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 不错的选择。我以前从未见过where 子句。它有什么作用?
    • 'where' 确保只为您的图像调用ITransformation(而不是例如字符串)。如果您不需要,您甚至可以使用public interface ITransformation&lt;T&gt; { T ApplyFrom(T sourceImage); }
    • 请注意,此选项会阻止使用泛型类型推断。
    • @Glorfindel,啊,我想我明白了。所以在 Java 中,类似的特性是通用约束语法,如下所示:method(List&lt;T extends SomeType&gt;)。对吗?
    • 它是相关的,但不是类比的。不过,很难在评论中解释其中的区别。
    猜你喜欢
    • 2019-02-14
    • 1970-01-01
    • 2016-12-24
    • 2019-12-22
    • 1970-01-01
    • 2015-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多