我想要一个泛型方法的两个重载:
public ReturnType<T> DoStuff<T>(T thing) {...}
public ReturnType<T> DoStuff<T>(IEnumerable<T> things) {...}
当然,麻烦在于IEnumerable<T>
本身是与第一个签名匹配的类型,因此当我尝试将集合传递给此方法时,它会调用第一个重载。
显然,我可以以不同的方式命名这些方法以消除歧义。但由于这些方法本质上做同样的事情,我想将它们保留为重载。
有什么方法可以定义T
在第一个签名中,这样它就会not接受一个IEnumerable
作为一个论点?
这是一种 hack,但您可能会滥用这样的事实:仅当在非扩展方法中找不到匹配项时才考虑扩展方法。
class MyClass {
public ReturnType<T> DoStuff<T>(IEnumerable<T> things) { ... }
public ReturnType<T> DoStuffSingle<T>(T thing) { ... }
}
static class MyClassExtensions {
public static ReturnType<T> DoStuff<T>(this MyClass myClass, T thing)
=> myClass.DoStuffSingle(thing);
}
在此之后,给定一个MyClass myClass;
:
-
myClass.DoStuff(123);
调用扩展方法int
-
myClass(new[] {123});
调用实例方法IEnumerable<int>
-
myClass("123");
调用实例方法IEnumerable<char>
-
myClass(t);
, where t
是不受约束的泛型参数类型T
,调用扩展方法T
,无论哪个接口T
实施。
在我看来,最后两条表明你可能不应该继续走这条路,但无论如何,没有什么可以阻止你不同意并继续这样做。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)