我真的很喜欢一个通用的数字类型作为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) => ...);
Run Code Online (Sandbox Code Playgroud)
缺乏:
dynamic关键字,在C#中有没有正确的方法呢?
我猜Java有一个Number类可能符合我的要求,但我想知道C#是否有类似的东西.
我想在C#中没有任何这样的东西,但我想我会要求确定.
即使有是涵盖数字类型,因为你裹了约束在一个基本类型或接口Func它不会对你有任何好.Func的输入类型是逆变的,因此它的参数不能比声明的更多.
换句话说,你不能代替Func<DateTime, ValueType, DateTime>了Func<DateTime, int, DateTime>像您可以用IEnumerable<T>(您可以替换IEnumerable<ValueType>用IEnumerable<int>)
我认为你最好的赌注是dynamic(仍然是类型安全,但在运行时与编译时)或者double或者decimal如果你想做数学并且不必保持相同的类型.
好消息:现在 .NET 6 和 C# 10 中有一个解决方案,参见。https://devblogs.microsoft.com/dotnet/preview-features-in-net-6-generic-math/#generic-math
当你想要任何数字时,你可以使用INumber<T>. 如果您需要任何特定的运算符,请使用相应的接口,例如IAdditionOperatorsfora + b或IIncrementOperatorsfora++等。
注意:在我回答时,此功能还只是预览版。微软将在 .NET 6 最终版本中保留这一点,因为他们仍然希望允许突破机会。要使用该功能,必须在项目配置中启用预览功能:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<EnablePreviewFeatures>true</EnablePreviewFeatures>
<LangVersion>preview</LangVersion>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="System.Runtime.Experimental" Version="6.0.0-preview.7.21377.19" />
</ItemGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
766 次 |
| 最近记录: |