为什么数字类型不共享通用接口?

2024-04-09

我最近遇到了一个问题,我想要一个可以同时处理双精度和整数的函数,并且想知道为什么所有数字类型(包含算术运算符和比较)没有通用接口。

它会让编写像这样的函数Math.Min(存在无数的重载)方式更方便。

引入额外的接口会是一个重大改变吗?

Edit:我想像这样使用这个

public T Add<T>(T a, T b) where T: INumber
{
    return a+b;
}

or

public T Range<T>(T x, T min, T max) where T:INumber
{
    return Max(x, Min(x, max), min);
}

Update

通用数学将作为 .NET 6 的预览功能提供。请阅读 .NET 开发博客中的公告:

https://devblogs.microsoft.com/dotnet/preview-features-in-net-6-generic-math/ https://devblogs.microsoft.com/dotnet/preview-features-in-net-6-generic-math/


如果您想做这种“通用”算术,那么强类型语言(例如 C#)的选择非常有限。马克·格拉维尔问题描述如下 http://www.yoda.arachsys.com/csharp/genericoperators.html:

.NET 2.0 将泛型引入了 .NET 世界,这为许多现有问题的优雅解决方案打开了大门。通用约束可用于将类型参数限制为已知接口等,以确保对功能的访问 - 或者对于简单的相等/不等式测试Comparer<T>.Default and EqualityComparer<T>.Default单例实现IComparer<T> and IEqualityComparer<T>分别(例如,允许我们对元素进行排序,而不必了解有关“T”的任何信息)。

尽管如此,在运营商方面仍然存在很大差距。因为运算符被声明为静态方法,所以没有IMath<T>或所有数字类型实现的类似等效接口;事实上,运营商的灵活性使得这很难以有意义的方式做到这一点。更糟糕的是:许多基本类型上的运算符甚至不作为运算符存在;相反,有直接的 IL 方法。为了使情况变得更加复杂,Nullable 需要“提升运算符”的概念,其中内部“T”描述适用于可空类型的运算符 - 但这是作为语言功能实现的,并且不是由运行时(使反射更加有趣)。

然而,C# 4.0 引入了dynamic您可以使用关键字在运行时选择正确的重载:

using System;

public class Program
{
    static dynamic Min(dynamic a, dynamic b)
    {
        return Math.Min(a, b);        
    }

    static void Main(string[] args)
    {
        int i = Min(3, 4);
        double d = Min(3.0, 4.0);
    }
}

您应该意识到,这会消除类型安全性,并且如果动态运行时找不到合适的重载来调用,您可能会在运行时遇到异常,例如因为你混合了类型。

如果您想获得类型安全,您可能需要查看以下可用的类MiscUtil http://www.yoda.arachsys.com/csharp/miscutil/usage/genericoperators.html库为基本操作提供通用运算符。

请注意,如果您仅执行特定操作,您实际上可能会使用内置类型已经实现的接口。例如,类型安全的泛型Min函数可能如下所示:

public static T Min<T>(params T[] values) where T : IComparable<T>
{
    T min = values[0];
    foreach (var item in values.Skip(1))
    {
        if (item.CompareTo(min) < 0)
            min = item;
    }
    return min;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么数字类型不共享通用接口? 的相关文章

  • 编写此代码片段的有效方法是什么? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 更有效和 或更短地重写此代码以节省字节并显得不那么冗长的方法 if N 2 0 N 6 N 8 N 10 N 12 N 14 N 16 N
  • 是否可以从 C++ 应用程序调用 C# 应用程序?

    我是一名编程学生 现在我已经上了两门 C 课程 这个学期我将参加我的第一门 C 课程 出于好奇 是否可以从 C 应用程序调用 C 应用程序 如果是的话 是否还可以检查运行该程序的计算机是否具有 NET框架 我只是很好奇 我想如果可能的话 这
  • 无法将 std::min 传递给函数,std::min 的副本有效

    Passing std min函数无法编译 我复制了 libcpp 声明std min进入我的源文件并且它可以工作 std 版本有什么问题 clang 和 gcc 也会发生同样的情况 在 Godbolt 上测试 https godbolt
  • XPATH 查询、HtmlAgilityPack 和提取文本

    我一直在尝试从名为 tim new 的类中提取链接 我也得到了解决方案 给出了解决方案 片段和必要的信息here https stackoverflow com questions 2982862 extracting a table ro
  • MFC CList 支持复制分配吗?

    我在 MSVC 中查找了 CList 定义afxtempl h http www cppdoc com example mfc classdoc MFC AFXTEMPL H html并记录在MSDN http msdn microsoft
  • while循环中的变量初始化

    我有一个可以分块读取文件的函数 public static DataObject ReadNextFile 数据对象看起来像这样 public DataObject public string Category get set And ot
  • 为什么需要数字后缀?

    C 语言 我确信还有其他语言 需要在数字文字末尾添加后缀 这些后缀指示文字的类型 例如 5m是一个小数 5f是一个浮点数 我的问题是 这些后缀真的有必要吗 或者是否可以从上下文中推断出文字的类型 例如 代码decimal d 5 0应该推断
  • C# 编译器数字文字

    有谁知道 C 编译器数字文字修饰符的完整列表 默认情况下 声明 0 使其成为 Int32 声明 0 0 使其成为 Double 我可以在末尾使用文字修饰符 f 来确保某些内容被视为 Single 例如像这样 var x 0 x is Int
  • 在 C# 中何时使用 ArrayList 而不是 array[]?

    我经常使用一个ArrayList而不是 正常 array 当我使用时 我感觉好像我在作弊 或懒惰 ArrayList 什么时候可以使用ArrayList在数组上 数组是强类型的 并且可以很好地用作参数 如果您知道集合的长度并且它是固定的 则
  • 无法为 wsdl 文件创建服务引用

    I have wsdl文件和xsd我本地机器上的文件 我想在项目中添加服务引用 我没有网络服务 我只有wsdl file 我收到以下错误 The document was understood but it could not be pro
  • 将错误代码映射到 C++ 中的字符串

    将错误代码从枚举映射到字符串的更有效方法是什么 在 C 中 例如 现在我正在做这样的事情 std string ErrorCodeToString enum errorCode switch errorCode case ERROR ONE
  • 使用多线程进行矩阵乘法?

    我应该使用线程将两个矩阵相乘 有两件事 当我运行程序时 我不断得到 0 我还收到消息错误 对于每个错误 它在粗体行上显示 警告 从不兼容的指针类型传递 printMatrix 的参数1 我尝试打印输出 还要注意 第一个粗体块 这是我解决问题
  • C# 中的 C/C++ 代码编译器

    在 C 中 我可以使用下面的代码编译 VB 和 C 代码 但无法编译 C C 代码 有什么办法可以做到这一点吗 C 编译器 public void Compile string ToCompile string Result null st
  • C 中使用 getrandom 实现随机浮点数

    我试图生成一个介于 0 和 1 之间的随机浮点数 无论是在 0 1 还是 0 1 对我来说都不重要 网上关于此的每个问题似乎都涉及rand 呼叫 播种time NULL 但我希望能够每秒多次调用我的程序 并每次都获得不同的随机数 这引导我找
  • 如何在dll级别读取app.config? [复制]

    这个问题在这里已经有答案了 我在一个解决方案中有一个控制台应用程序项目和库项目 dll The 图书馆项目有 app config 文件 我在其中存储我在库中使用的一些键值对 控制台应用程序引用此 dll 我有另一个 app config
  • Autoconf 问题:“错误:C 编译器无法创建可执行文件”

    我正在尝试使用 GNU 自动工具构建一个用 C 编写的程序 但显然我设置错误 因为当configure运行 它吐出 configure error C compiler cannot create executables 如果我看进去con
  • 有没有办法直接在函数参数中格式化字符串而不是使用临时字符串?

    我有一个接受字符串 字符数组 作为参数的函数 void enterString char my string 当使用这个函数时 我经常发现自己想要输入格式化的字符串 我使用 sprintf 来做到这一点 然而 我每次都必须创建一个临时字符串
  • 这种尺寸对齐是如何工作的

    对于所提供的评论 我无法理解以下代码 这段代码的作用是什么 以及等效的代码是什么8 aligned segment size must be 4 aligned attr gt options ssize 3 Here ssize is o
  • 如何提高环复杂度?

    对于具有大量决策语句 包括 if while for 语句 的方法 循环复杂度会很高 那么我们该如何改进呢 我正在处理一个大项目 我应该减少 CC gt 10 的方法的 CC 并且有很多方法都存在这个问题 下面我将列出一些例如我遇到的问题的
  • SQL Server“未找到网络路径”在不同环境中随机且不频繁地发生

    类似 如果不是同一个问题 随机遇到网络路径未找到异常 https stackoverflow com questions 38696448 network path not found exception encountered rando

随机推荐

  • 为什么我没有从 Google OAuth 请求收到 RefreshToken?

    我正在尝试将 Google 日历集成到我的应用程序中 但在传递 RefreshToken 的 OAuth 授权方面遇到一些问题 我收到的 AccessToken 没有问题 但 RefreshToken 属性为 null 请参阅标记为 ERR
  • 用于处理 win32 FILETIME 的 Java 库?

    是否有任何 Java 库可以处理 win32文件时间 http msdn microsoft com en us library ms724284 28v vs 85 29 aspx时间间隔 它基本上是自 1601 年 1 月 1 日以来以
  • 3 个流体 Div 宽度 2 个固定边距?

    我有以下设置 但是将 div 的宽度设置为 30 左右并不能始终如一地工作 一旦窗口宽度小于某个数字 第三个 div 就会低于某个数字 有没有更好的方法来做到这一点 以便我的 div 始终保持内联并不断变得越来越小 同时它们之间的边距保持固
  • 用于 C++ 的 FastCGI

    我只找到了两个用于 C 的 FastCGI 库 有的是 官方 一 http www fastcgi com drupal node 6 q node 21 and 快速cgi https savannah nongnu org projec
  • 用户可编辑带有友好 ID 的 slugs

    Case 我的站点表单包含一个 slug 字段 如果输入了值 则应将其用作 slug 编辑 一些澄清 我想要的很像 slugs 在 WordPress 中的工作方式 如果未提供 slug gt slug 名称 如果提供了 slug gt 使
  • 如何有效检测逻辑和物理处理器的数量?

    目前我正在使用这个功能 它工作正常 但每个查询大约需要 1 秒 所以就我而言 我在应用程序中浪费了 3 秒钟 目前我正在考虑使用 3 个线程在一秒钟内获取所有信息 function GetWMIstring wmiHost wmiClass
  • Smalltalk:原语是如何实现的?

    我知道一切都是对象 您可以向 Smalltalk 中的对象发送消息来执行几乎所有操作 现在我们如何实现一个对象 内存表示和基本操作 来表示原始数据类型 例如如何 对于整数的实现 我查看了 Smalltalk 的源代码并发现了这个Smalli
  • Request.IsAuthenticated 始终为 true。我错过了什么?

    我正在尝试将用户名添加到 cookie 并在注销时清除它 但是Request IsAuthenticated返回始终为 true 因此我无法知道它是否是下一页上的成员 这是我正在尝试的 public void Logout FormsAut
  • 如何修复“向客户端发送响应时失败(22:无效参数)”

    使用 directio 时 如果有多个扇区大小不同的挂载点 Nginx 无法读取文件 我们的服务器在 Nginx 的根文件夹下安装了不同的硬盘 我们所有的旧磁盘的扇区大小都是 512 当我们更换磁盘时 Nginx 突然无法从该磁盘读取文件
  • 在 Android 设备中使用 ACTION_PICK 意图仅显示电话号码联系人

    我的目标是仅向用户显示带有电话号码的联系人 并让用户选择我想在本地存储的几个联系人 我在下面的方法中使用了各种选项来代替 ContactsContract Contacts CONTENT URI 但我收到了很多显示的联系人 许多都是垃圾邮
  • 查找 Java 类文件版本之间的差异

    我正在使用来自商业供应商的大型 Java Web 应用程序 我从供应商那里收到了一个新的 class 文件形式的补丁 该文件应该可以解决我们在软件方面遇到的问题 过去 应用该供应商的补丁会导致出现新的且完全不相关的问题 因此我想在将其应用于
  • 使用端点原型数据存储时设置父键但不设置子键

    如何为 EndpointsModel 设置父级 祖先并让数据存储区自动生成实体 ID 密钥 我已经尝试去适应带有祖先的键 http endpoints proto datastore appspot com examples keys wi
  • Lighttable,设置字体大小

    我是 Light Table IDEAS 的新手 有谁知道如何设置workspace和 Windows 字体大小 我可以更改编辑器字体大小 但不知道如何设置font size对于其他元素 或者更改所有 IDE 字体的全局字体大小 打开命令窗
  • DateTime.TryParseExact 未按预期工作

    谁能解释为什么以下代码片段返回 true 根据文档 d 自定义格式说明符 http msdn microsoft com en us library 8kb3ddd4 aspx dSpecifier 一位数日期的格式不带前导零 那么 当我给
  • Pyparsing - 匹配最外面的一组嵌套括号

    我正在尝试使用 pyparsing 构建一个解析器 该解析器将匹配任意嵌套的括号内的所有文本 如果我们考虑这样的字符串 A B C D E F G Random Middle text H I J 我想要的是解析器以返回两个匹配的方式进行匹
  • 地图在移动设备上显示错误(使用 JQuery mobile)

    我正在使用 jQuery mobile 并且必须显示一些地图 我使用的功能是每次单击特定链接时都会创建地图 但在生成第一个地图后 其他地图显示错误 这里有一个例子 第一张地图 其他地图 我使用这样的函数 function buildMap
  • 使用 EVAL、SCAN 和 DEL 的 Redis 通配符删除脚本返回“非确定性命令后不允许写入命令”

    因此 我正在寻求构建一个 lua 脚本 该脚本使用 SCAN 根据模式查找键并删除它们 原子地 我首先准备了以下脚本 local keys local done false local cursor 0 repeat local resul
  • gridview中如何合并两个单元格

    我在 gridview 中有一些数据 格式如下 A B 1 2 adeel 3 4 sml 现在我想将该行与 B 列下的空单元格合并 我该怎么做 您可以使用 layout columnSpan 或 layout rowSpan 根据需要使对
  • ExpandableListView、OnChildClickListener

    我有组列表 每个组内都有填充的子项目 我已经实现了searchview with filtered ressults and myExpandableListView 可以展开和折叠 问题是 我不知道如何处理 OnChildClickLis
  • 为什么数字类型不共享通用接口?

    我最近遇到了一个问题 我想要一个可以同时处理双精度和整数的函数 并且想知道为什么所有数字类型 包含算术运算符和比较 没有通用接口 它会让编写像这样的函数Math Min 存在无数的重载 方式更方便 引入额外的接口会是一个重大改变吗 Edit