![]() |
1
47
约束不是签名的一部分,但参数是。在过载解决过程中强制执行参数中的约束。 所以让我们把约束放到一个参数中。它很难看,但很管用。
(迟六年总比不迟一年好吗?) |
![]() |
2
19
不幸的是,您不能仅根据约束来区分要调用的方法的类型。 因此,您需要在不同的类中或用不同的名称来定义一个方法。 |
![]() |
3
10
关于你的评论 Marnix's answer 你可以通过一点反思来实现你想要的。
在下面的示例中,不受约束的
(注意
此示例不是threadsafe
. 如果您需要线程安全,那么您要么需要在对缓存字典的所有访问周围使用某种类型的锁定,要么——如果您能够以.net4为目标——使用
|
![]() |
4
5
删除第一个方法的结构约束。如果需要区分值类型和类,可以使用参数的类型来区分。
|
![]() |
5
2
将我的注释放大到lukeh,如果需要使用反射来调用基于类型参数的不同操作(与对象实例的类型不同),那么一个有用的模式是创建一个私有的通用静态类,类似于以下内容(这个确切的代码是未经测试的,但我以前做过这种事情): static class FooInvoker<T> { public Action<Foo> theAction = configureAction; void ActionForOneKindOfThing<TT>(TT param) where TT:thatKindOfThing,T { ... } void ActionForAnotherKindOfThing<TT>(TT param) where TT:thatOtherKindOfThing,T { ... } void configureAction(T param) { ... Determine which kind of thing T is, and set `theAction` to one of the ... above methods. Then end with ... theAction(param); } }
请注意,如果试图为创建委托,则反射将引发异常
FooInvoker<T>.theAction(param); 只有第一个调用需要任何反射。后续调用将直接调用委托。 |
![]() |
6
1
如果不需要通用参数,只想在编译时区分这三种情况,可以使用以下代码。
|
![]() |
7
0
值得庆幸的是,从C版本7.3开始,这种混乱不需要那么多。 见 Whats new in C# 7.3 -它不是很明确,但在重载解析期间,它现在似乎在某种程度上使用了“where”参数。
也看到 Selecting C# Version 在您的Visual Studio项目中 它仍将看到与以下内容的冲突
但会正确解决
|
![]() |
Glory Raj · 有什么方法可以使这两个块具有共同的功能吗 2 年前 |
![]() |
milczi · Swift通用无强制展开向下投射 6 年前 |
![]() |
bugs · Typescript-泛型类型扩展自身 6 年前 |
![]() |
John Bustos · C#通用工厂模式,不说明通用工厂模式的类型 6 年前 |
![]() |
Blankdud · 具有默认数据的通用对象创建方法 6 年前 |
![]() |
Tim Hutchison · 从泛型对象列表中读取泛型值 6 年前 |