首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C#:扩展中的多个类型参数

C#:扩展中的多个类型参数
EN

Stack Overflow用户
提问于 2009-07-08 02:32:26
回答 2查看 2.7K关注 0票数 1

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

代码语言:javascript
复制
public static M Slice<M,T>(this M source, int start, int end) where M : IList<T>
{
    //slice code
}

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

(是的,人们可以很容易地编写一个仅适用于List的示例,但我很好奇这是否可能。)

EN

Stack Overflow用户

回答已采纳

发布于 2009-07-08 02:35:26

对于这些情况,There编译器不会自动推断T类型。即使它不是一个扩展方法,您仍然必须手动指定类型参数。

例如,如果将类声明为:

代码语言:javascript
复制
class MyNastyClass : IList<int>, IList<double> {
}

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

代码语言:javascript
复制
Slice(myList, 0, 10); // compile-time error, T cannot be inferred.
Slice<IList<int>, int>(myList, 0, 10); // works.

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

代码语言:javascript
复制
public static void Slice<M>(this IList<M> source, int start, int end)

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

代码语言:javascript
复制
public static void SomeMethod<T,U>(this IEnumerable<T> collection, U anotherParameter)
票数 3
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1095875

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档