使用扩展方法时出现意外行为

2024-03-14

为什么会出现这种情况?请遵守以下代码:

static class StringExtension
{
    public static string Remove(this string s, char c)
    {
        return s.Replace(c.ToString(), "");
    }
    public static string Remove(this string s, char[] a)
    {
        foreach (char c in a)
        {
            s = s.Remove((char)c); // <---- ArgumentOutOfRange Exception here
        }
        return s;
    }
}
class Program
{

    static void Main(string[] args)
    {
        char[] a = new char[] { '.', ',' };

        string testString = "Clean.this,string.from,periods.and,commas.";

        Console.WriteLine(testString.Remove(a));

    }
}

当我运行此代码时,我在指示行收到 ArgumentOutOfRange 异常。事实证明,即使我有扩展名 Remove (this, char) 的特定代码,并且我明确(尽管应该没有理由)指定参数的类型,它也会忽略我的扩展名并尝试调用原始的 Remove( int) 方法。

是我做错了什么还是这是 C# 中的错误?

附:我用的是VS2010。


这行:

s.Remove((char) c);

正在打电话string.Remove(int) http://msdn.microsoft.com/en-us/library/system.string.remove.aspx- 如果可以的话,编译器将始终使用适用的实例方法而不是扩展方法。它适用于从隐式转换char to int。这就是抛出异常的方法,因为您传递给它的参数超出了范围。 (事实上​​,你很幸运 - 在更糟糕的情况下,它会in范围,并返回完全意想不到的结果。)

一般来说我会strongly建议您不要创建与扩展类型上的实例方法同名的扩展方法,特别如果他们有相同数量的参数。一般来说,如果不添加扩展方法,解决重载问题就已经足够困难了。不要忘记,无论何时you如果你无法轻易地弄清楚你的代码在做什么,那么在一年内阅读代码的人将会面临十倍困难的工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用扩展方法时出现意外行为 的相关文章

  • 如何验证文件名称在 Windows 中是否有效?

    是否有一个 Windows API 函数可以将字符串值传递给该函数 该函数将返回一个指示文件名是否有效的值 我需要验证文件名是否有效 并且我正在寻找一种简单的方法来完成此操作 而无需重新发明轮子 我正在直接使用 C 但针对的是 Win32
  • 无法使用已与其底层 RCW 分离的 COM 对象。在 oledb 中

    我收到此错误 但我不知道我做错了什么 下面的代码在backrgroundworker中 将异常详细信息复制到剪贴板 System Runtime InteropServices InvalidComObjectException 未处理 通
  • 是否可以强制 XMLWriter 将元素写入单引号中?

    这是我的代码 var ptFirstName tboxFirstName Text writer WriteAttributeString first ptFirstName 请注意 即使我使用 ptFirstName 也会以双引号结束 p
  • Qt-Qlist 检查包含自定义类

    有没有办法覆盖加载自定义类的 Qt QList 的比较机制 即在 java 中你只需要重写一个比较方法 我有一个带有我的自定义类模型的 QList QList
  • 获取按下的按钮的返回值

    我有一个在特定事件中弹出的表单 它从数组中提取按钮并将标签值设置为特定值 因此 如果您要按下或单击此按钮 该函数应返回标签值 我怎样才能做到这一点 我如何知道点击了哪个按钮 此时代码返回 DialogResult 但我想从函数返回 Tag
  • UML类图:抽象方法和属性是这样写的吗?

    当我第一次为一个小型 C 项目创建 uml 类图时 我在属性方面遇到了一些麻烦 最后我只是将属性添加为变量 lt
  • 如何避免情绪低落?

    我有一个实现状态模式每个状态处理从事件队列获取的事件 根据State因此类有一个纯虚方法void handleEvent const Event 事件继承基础Event类 但每个事件都包含其可以是不同类型的数据 例如 int string
  • 如何忽略“有符号和无符号整数表达式之间的比较”?

    谁能告诉我必须使用哪个标志才能使 gcc 忽略 有符号和无符号整数表达式之间的比较 警告消息 gcc Wno sign compare 但你确实应该修复它警告你的比较
  • 将布尔参数传递给 SQL Server 存储过程

    我早些时候问过这个问题 我以为我找到了问题所在 但我没有 我在将布尔参数传递给存储过程时遇到问题 这是我的 C 代码 public bool upload false protected void showDate object sende
  • 为什么#pragma optimize("", off)

    我正在审查一个 C MFC 项目 在某些文件的开头有这样一行 pragma optimize off 我知道这会关闭所有以下功能的优化 但这样做的动机通常是什么 我专门使用它来在一组特定代码中获得更好的调试信息 并在优化的情况下编译应用程序
  • 如何将图像和 POST 数据上传到 Azure 移动服务 ApiController 终结点?

    我正在尝试上传图片and POST表单数据 尽管理想情况下我希望它是json 到我的端点Azure 移动服务应用 我有ApiController method HttpPost Route api upload databaseId sea
  • 使用 System.Text.Json 即时格式化 JSON 流

    我有一个未缩进的 Json 字符串 例如 hash 123 id 456 我想缩进字符串并将其序列化为 JSON 文件 天真地 我可以使用缩进字符串Newtonsoft如下 using Newtonsoft Json Linq JToken
  • 从路径中获取文件夹名称

    我有一些路c server folderName1 another name something another folder 我如何从那里提取最后一个文件夹名称 我尝试了几件事 但没有成功 我只是不想寻找最后的 然后就去休息了 Thank
  • 将自定义元数据添加到 jpeg 文件

    我正在开发一个图像处理项目 C 我需要在处理完成后将自定义元数据写入 jpeg 文件 我怎样才能做到这一点 有没有可用的图书馆可以做到这一点 如果您正在谈论 EXIF 元数据 您可能需要查看exiv2 http www exiv2 org
  • XSL字符串多重替换功能

    如何让这个函数进行多重替换 经验 替换aaa with 111并替换bbb with 222 etc
  • 如何在 VBA 中声明接受 XlfOper (LPXLOPER) 类型参数的函数?

    我在之前的回答里发现了问题 https stackoverflow com q 19325258 159684一种无需注册即可调用 C xll 中定义的函数的方法 我之前使用 XLW 提供的注册基础结构 并且使用 XlfOper 类型在 V
  • 如何让Gtk+窗口背景透明?

    我想让 Gtk 窗口的背景透明 以便只有窗口中的小部件可见 我找到了一些教程 http mikehearn wordpress com 2006 03 26 gtk windows with alpha channels https web
  • C - 直接从键盘缓冲区读取

    这是C语言中的一个问题 如何直接读取键盘缓冲区中的数据 我想直接访问数据并将其存储在变量中 变量应该是什么数据类型 我需要它用于我们研究所目前正在开发的操作系统 它被称为 ICS OS 我不太清楚具体细节 它在 x86 32 位机器上运行
  • const、span 和迭代器的问题

    我尝试编写一个按索引迭代容器的迭代器 AIt and a const It两者都允许更改容器的内容 AConst it and a const Const it两者都禁止更改容器的内容 之后 我尝试写一个span
  • 如何使用 std::string 将所有出现的一个字符替换为两个字符?

    有没有一种简单的方法来替换所有出现的 in a std string with 转义 a 中的所有斜杠std string 完成此操作的最简单方法可能是boost字符串算法库 http www boost org doc libs 1 46

随机推荐

  • 移动设备上的自动对焦文本字段,但没有键盘?

    作为我的登录和注册表单的一部分 如果出现错误 它将自动聚焦相关字段 其实 事情并不像我想象的那么简单 让我尝试解释一下 基本上 在这个项目中 页面是通过 AJAX 加载的 表格可能包括autofocus属性 这很好用 但在移动设备上它只显示
  • 禁止直接访问图像

    我正在制作一个小家庭相册 打算稍后向其他人开放以存储图像 我将图像上传到 images 然后调整它们大小 3 次 普通视图 缩略图和小版本 并将它们移动到 images thumbs images normal images tiny 然后
  • mysql 加载数据内文件更新

    我目前正在使用 mySQL LOAD DATA INFILE 将 csv 文件插入到我的数据库中 该 csv 文件每天都会下载到服务器 以保持产品数据最新 我想知道的是如何使用新的 csv 更新表并保留没有不同的现有数据 这是我目前的声明
  • scala 中的插入排序实现

    我正在尝试 Scala 我想看看如何在 scala 中实现插入排序 并满足以下要求 嵌套 for 循环 输入数组 Int 如果可能的话 通过引用方式修改函数内容的方法 否则返回 Array Int 如果这不是实现插入排序的 Scala 方法
  • 抓取时如何避免连接节点中的所有文本

    当我从 HTML 或 XML 中抓取多个相关节点来提取文本时 所有文本都会连接成一个长字符串 从而无法恢复单个文本字符串 例如 require nokogiri doc Nokogiri HTML lt
  • sed 仅替换完全匹配

    我不想替换像这样的字符串Europe12 with Europe12 yesturday在一个文件中 不改变Europe12 36文件中也存在的字符串 I tried basename Europe12 sed i s b basename
  • 为什么Matlab中复数共轭转置是默认的

    如果矩阵有复数元素并且我想使用命令将 A 转置为 A gt gt A 为什么设计是这样的a bi转变为a bi 它有什么用 From here http mathworld wolfram com ConjugateTranspose ht
  • 站点根相对路径不起作用

    我不明白这一点 它搞砸了整个网站 因为我使用的是 php 模板 根据我读过的每一篇文章 据说以 开头的链接会让我从根开始 但是 当我以 开头时 它根本不起作用 我的变量位于 public html cis130 textfiles php
  • 将 fgetcsv 响应转换为特定的 json

    我有一个带有标题的 CSV 文件 Description BusinessSurname IsCustomer IsSupplier AddressType Business Address IsInternational 第一排 Cont
  • JSTL、Bean 和方法调用

    我正在开发一个 JSP 我需要调用来自 Bean 的对象的方法 以前版本的页面没有使用JSTL 并且可以正常工作 我的新版本有这样的设置
  • 在 .NET 中加载第一个 sql 连接需要很长时间

    由于某种原因 第一次打开与 SQL Server 数据库的连接需要 7 秒 后续连接需要一秒 知道原因是什么吗 我正在使用 C 和 asp net 编译后 我每次重新启动站点时都会本质上 这意味着每次它需要实际创建 第一个 连接 我知道设置
  • 从数组中仅删除一个重复项

    我试图只从数组中删除 2 之一 但我的代码删除了所有这些 我的代码如下 var arr 2 7 9 5 2 arr filter item gt item 2 and var arr 2 7 9 2 2 5 2 arr filter ite
  • 让我的 jProgressBar 在 1 到 100 的计时器上运行

    我正在浏览这个线程 如何让定时器倒计时并带有进度条 https stackoverflow com questions 5931933 how to make timer countdown along with progress bar
  • 使用 pyinstaller 和 pysqlcipher 创建一个文件 exe 时出现问题

    我正在尝试创建一个文件 exe 以在任何 Windows 计算机上运行 但我遇到了 pysqlcipher 问题 我已经回到了一些基本代码 仅使用密钥创建一个简单的数据库 在我的开发机器上 无论我使用 python 文件还是编译的 exe
  • 使用 PyPDF2 批量旋转 PDF 文件

    我一直在编写用于批量旋转文件夹内的 PDF 文件的代码 但我找不到迭代和更改旋转文件的目标文件夹的方法 我的目的是将新文件以相同的名称保存在另一个文件夹中 from os import listdir from PyPDF2 import
  • 阻止空格键触发 Eclipse 中的自动完成

    Update This was fixed in Eclipse 2018 12 This behaviour is still default but can be configured off see the accepted answ
  • jQuery 单击事件的行为与 Firefox 中的实时功能不同

    使用 Firefox 时 将事件单击与实时功能结合使用会导致奇怪的行为 在 Firefox 中 右键单击时也会触发单击 Internet Explorer 7 和 Google Chrome 中都不会发生同样的情况 Example 没有直播
  • HTML:不同的浏览器以不同的实际 px 大小呈现 1em 的情况有多常见?

    如您所知 您可以使用 CSS 指定尺寸 以 px 或 em 为单位 据我了解 em 的意思是 当前元素字体的行高 我目前的方法是始终使用 px 也用于边距 这似乎是一个有争议的做法 问题 我可以依赖 px 和 em 的比例在不同浏览器中保持
  • Maven exec 插件不能依赖提供的依赖项?

    在我的 POM 中我有这个依赖项
  • 使用扩展方法时出现意外行为

    为什么会出现这种情况 请遵守以下代码 static class StringExtension public static string Remove this string s char c return s Replace c ToSt