gpt4 book ai didi

c# - 为什么扩展方法中的 `char` 参数被解释为 `int` ?

转载 作者:行者123 更新时间:2023-12-04 07:39:45 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Unexpected behaviour while using extension methods

(1 个回答)



How to use string.Substring(char, char) instead string.Substring(int, int)?

(1 个回答)


4 个月前关闭。




我为 string 编写了一个带有非常简单的扩展方法的 .DLL 库。
我的方法 - .Remove(char deletedChar) ,删除 char 中所有出现的 string 。这会重载默认的 .Remove(int startIndex) 方法。但是,当我想使用它时,会调用 .Remove(int startIndex),而不是我的方法,尽管我将 char 作为参数。
我的意思是,鉴于此代码:

string Test = "12-34-56-78-90-123-456-789-0123-4567-89012-34567-890123-456789-000000";
MessageBox.Show(Test.Remove('-'));
我的预期结果是:
1234567890123456789012345678901234567890123456789000000
然而,实际的结果是:
12-34-56-78-90-123-456-789-0123-4567-89012-34
在屏幕截图上查看:
ss
这意味着,我的 char '-' 被解释为它的 ASCII 值 (45),这是删除字符串的起始索引。
为什么会发生这种情况?即使将 char 转换为 char (即 (char)'-' )也无法修复它。我知道我可以简单地重命名扩展方法,但我仍然不明白为什么会发生这种情况。有人可以解释这种现象或指出解释它的文档吗?
粘贴我的扩展方法以防有人想要使用它:
    /// <summary>
/// Removes all occurences of specified char.
/// </summary>
/// <param name="str"></param>
/// <param name="deletedChar">The char you want to remove.</param>
/// <returns>string without the specified char.</returns>
public static string Remove(this string str, char deletedChar)
{
for (int i = 0; i < str.Length; i++)
{
if (str[i] == deletedChar)
{
str = str.Remove(i, 1);
i--;
}
}
return str;
}

最佳答案

如果找到,则在扩展之前调用 C# 实例方法。
来自 documentation :

When the compiler can't find an instance method with a matching signature, it will bind to a matching extension method if one exists.


编写这个helper类,可以看到调用了好方法:
public static class StringHelper
{
public static string MyRemove(this string str, int index)
{
return "remove at index";
}
public static string MyRemove(this string str, char code)
{
return "remove all chars";
}
}
测试
Console.WriteLine("".MyRemove(1));
Console.WriteLine("".MyRemove('a'));
输出
remove at index
remove all chars
因此,解决方案是使用专用方法的名称:
public static class StringHelper
{
public static string RemoveAll(this string str, char deletedChar)
{
for ( int i = 0; i < str.Length; i++ )
{
if ( str[i] == deletedChar )
{
str = str.Remove(i, 1);
i--;
}
}
return str;
}
}
因此设计和使用更加清晰和干净,以及更多的说话,而参数的类型告诉我们要删除什么。
但是这样的方法没有优化,例如可以替换为:
public static string RemoveAll(this string str, char code)
{
return str.Replace(code.ToString(), "");
}
或者通过这个更好的:
using System.Text;

public static string RemoveAll(this string str, char code)
{
var builder = new StringBuilder();
foreach ( char c in str )
if ( c != code )
builder.Append(c);
return builder.ToString();
}
或者使用 Linq,但可能不如以前优化:
using System.Linq;

public static string RemoveAll(this string str, char code)
{
return new string(str.Where(c => c != code).ToArray());
}

关于c# - 为什么扩展方法中的 `char` 参数被解释为 `int` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67546438/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com