【问题标题】:Make a method accept multiple numeric parameters of different type使方法接受多个不同类型的数字参数
【发布时间】:2019-04-26 20:09:47
【问题描述】:

基本上我有一个特定的方法,它使用 double 和 int 值来找出我想要设置的 css 类。我在不同的地方做同样的事情,但是用 int + int 代替。

这引发了一个问题,即是否有一种好方法可以提供一个通用的解决方案。

重载本来是一种方法,但我不想为所有数字变体编写重载。

所以我想我会看看是否有一个特定于数字的接口类型可以用作泛型类型约束 - 但我没有找到(因为任何东西都可以实现 IConvertible?)

int32反编译结果:

#if GENERICS_WORK
public struct Int32 : IComparable, IFormattable, IConvertible
    , IComparable<Int32>, IEquatable<Int32>
/// , IArithmetic<Int32>
#else
public struct Int32 : IComparable, IFormattable, IConvertible
#endif

没有,没有号码界面。

这就是我想出的——它工作得很好,但也接受对潜在非数字对象的调用。有关如何使该方法更具限制性的任何建议?

    public static string GetThresholdColorClass(IConvertible desiredThreshold, IConvertible actualProgress)
    {
        var actual = actualProgress.ToDouble(CultureInfo.InvariantCulture);
        var desired = desiredThreshold.ToDouble(CultureInfo.InvariantCulture);
        if (actual >= desired)
            return "green";
        if (actual <= 0)
            return "red";
        return "yellow";
    }

【问题讨论】:

    标签: c#


    【解决方案1】:

    遗憾的是什么都没有(例如参见Is there a constraint that restricts my generic method to numeric types?)。您不能创建需要“数字”作为参数的泛型类。

    您可以做的是仅创建方法的double 变体(从intdouble 的隐式转换,doubles 可以包含所有int 值)

    从技术上讲,Gravell 编写了一些函数来使用泛型类型进行数学运算...参见 https://jonskeet.uk/csharp/miscutil/usage/genericoperators.html,但它们有点“hack”ey :-)

    【讨论】:

    • 嗯。遗憾的是没有内置的方式。但是隐式转换在这里也可以完成这项工作。还要感谢您对其他问题的引用。有点让我的重复。虽然搜索时没有找到它 - 单词略有不同。现在我必须查找 T4 解决方案,因为它看起来也很有趣。哈哈。谢谢!
    • @AndreasMüller 如果你想测试通用的“hack”,这里有一些我几年前写的代码行stackoverflow.com/a/18190731/613130。您可以轻松地将它们重新用于其他操作员。
    猜你喜欢
    • 2016-01-25
    • 2012-04-12
    • 2012-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-18
    • 2014-01-24
    • 1970-01-01
    相关资源
    最近更新 更多