【问题标题】:C#: Multiple type parameters in extensionsC#:扩展中的多个类型参数
【发布时间】:2010-11-08 21:56:10
【问题描述】:

我试图创建一个可以对任何类似数组的类进行切片的扩展(因为在标准库中奇怪地没有切片)。例如:

public static M Slice<M,T>(this M source, int start, int end) where M : IList<T>
{
    //slice code
}

但是,编译器不会将此方法附加到类型 M 的对象(即使它的错误消息声称这是它正在寻找的)。它似乎更依赖于方法本身的类型参数,例如以某种方式,但我不完全了解事情是如何运作的。

(是的,可以轻松编写一个仅适用于 List 的示例,但我很好奇这是否可能。)

【问题讨论】:

    标签: c# generics


    【解决方案1】:

    对于这些情况,编译器不会自动推断类型 T。即使它不是扩展方法,你仍然需要手动指定类型参数。

    例如,如果类被声明为:

    class MyNastyClass : IList<int>, IList<double> {
    }
    

    您希望T 是什么? int 还是 double?因此,您始终必须使用特定参数手动调用它:

    Slice(myList, 0, 10); // compile-time error, T cannot be inferred.
    Slice<IList<int>, int>(myList, 0, 10); // works.
    

    解决方法是去掉类型参数T(这里不需要约束):

    public static void Slice<M>(this IList<M> source, int start, int end)
    

    顺便请注意,这与参数的数量无关。您可以拥有任意数量的类型参数,只要编译器可以推断它们(根据 C# 规范的泛型类型推断规则)。例如,可以在不指定类型参数的情况下调用此扩展方法:

    public static void SomeMethod<T,U>(this IEnumerable<T> collection, U anotherParameter)
    

    【讨论】:

      【解决方案2】:

      你看过List.GetRange method吗?

      【讨论】:

      • 是的,对不起,我正在做一个深拷贝。否则 GetRange 是完美的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多