【发布时间】:2016-06-29 12:29:22
【问题描述】:
我真的很想要一个泛型数值类型作为下面给出的Func<TInput, THere, TResult> 的第二个泛型类型参数,所以我可以在我喜欢的时候提供整数、双精度或小数。
var _resultSelectors = new Dictionary<string, Func<DateTime, /*here*/ double, DateTime>>();
// so I can do
_resultSelector.Add("foo", (DateTime dt, int x) => ...);
_resultSelector.Add("bar", (DateTime dt, double d) => ...);
_resultSelector.Add("gar", (DateTime dt, float f) => ...);
_resultSelector.Add("har", (DateTime dt, decimal d) => ...);
短:
- 制作自己的类型;或
- 使用对象并对值类型进行装箱和拆箱;或
- 使用
dynamic关键字,
在 C# 中是否有适当的方法来做到这一点?
我猜 Java 有一个 Number 类可能符合我的要求,但我想知道 C# 是否有类似的东西。
我想 C# 中没有这样的东西,但我想我会问一下。
【问题讨论】:
-
如果您可能拥有全部 4 个,我建议您从
double或decimal中选择一个(取决于您的用例,即浮点是否合适)并将其余的转换为那个。 -
@CharlesMager 这是个好主意。
-
没有通用接口,但您仍然会遇到根据值的运行时类型找到要调用的正确函数的问题。具体数值从何而来?
-
我非常很想将此标记为 this question 的副本。
-
@DStanley 你是对的。一个通用的
INumeric<in T>将是一个无限深的兔子洞。但与此同时,像简单的INumeric这样的非通用标记界面会有什么问题?