ToString 和字符串连接 - 意外行为

2023-12-27

根据互联网,当你这样做时

String someString = "" + object1 + object2 + object3;

ToString()在每个对象上调用。

但这并没有发生! 这段代码:

String a = "a" + foo;
String b = "b" + foo.ToString();

Console.WriteLine(a);
Console.WriteLine(b);

Prints:

a
b("key":"foo")

这怎么可能?

我对整个项目进行了 Resharper 全面清理,它在某些地方破坏了代码,因为它删除了ToString()在这样的字符串连接中!!损失了好几个小时..

Edit:这个问题发生在我正在使用的一个小型图书馆中。我无法提供非常短的单文件代码来重现这一点,但我已经使用这个库创建了一个小项目并上传到 github:

https://github.com/Vistritium/ToStringCSObjectConcat https://github.com/Vistritium/ToStringCSObjectConcat https://github.com/Vistritium/ToStringCSObjectConcat/blob/master/TestString/Program.cs https://github.com/Vistritium/ToStringCSObjectConcat/blob/master/TestString/Program.cs

该库有 1178 行长。


如果您提供了隐式运算符 http://msdn.microsoft.com/en-us/library/z5z9kes2.aspx将您的类转换为字符串,例如:

public class Foo
{
    public string Key { get; set; }

    public string Value { get; set; }

    public static implicit operator string(Foo foo)
    {
        return foo == null ? string.Empty : foo.Value;
    }

    public override string ToString()
    {
        var str = string.Empty;
        if (!string.IsNullOrEmpty(Key))
        {
            if (str.Length > 0)
                str += ";";
            str += ("Key=" + Key);
        }
        if (!string.IsNullOrEmpty(Value))
        {
            if (str.Length > 0)
                str += ";";
            str += ("Value=" + Value);
        }
        return str;
    }
}

在这种情况下:

    string a = "a" + new Foo { Key = "foo", Value = "" };
    string b = "b" + new Foo { Key = "foo", Value = "" }.ToString();

    Debug.WriteLine(a); // Prints "a".
    Debug.WriteLine(b); // Prints "bKey=foo

如果你有的话,你也可以获得这种效果超载了+操作员 http://msdn.microsoft.com/en-us/library/aa288467%28v=vs.71%29.aspx for string and Foo.

Update

根据 C# 语言规范,7.2.2 运算符重载 http://msdn.microsoft.com/en-us/library/aa691324%28v=vs.71%29.aspx:

所有一元和二元运算符都有预定义的实现,可在任何表达式中自动使用。除了预定义的实现之外,还可以通过在类和结构中包含运算符声明来引入用户定义的实现(第 10.9 节) http://msdn.microsoft.com/en-us/library/aa664461(v=vs.71).aspx。用户定义的运算符实现始终优先于预定义的运算符实现:仅当不存在适用的用户定义的运算符实现时,才会考虑预定义的运算符实现。

这就是为什么优先调用自定义逻辑而不是标准逻辑。

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

ToString 和字符串连接 - 意外行为 的相关文章

随机推荐

  • 检查目录是否是符号链接?

    In os有一个函数os path islink PATH 它检查是否PATH是符号链接 但是如果当 PATH 是某个目录的符号链接时失败 相反 python 认为它是目录 os path isdir PATH 那么如何检查目录是否是链接呢
  • ConcurrentBag 实现中是否存在内存泄漏? [复制]

    这个问题在这里已经有答案了 可能的重复 ConcurrentBag 中可能存在内存泄漏吗 https stackoverflow com questions 5353164 possible memoryleak in concurrent
  • 如何在 Android 中发布图片

    我有这个表单 用于使用 HttpPost 将图像上传到服务器 我使用 HTML 表单完成了此操作 但它不适用于 Android 的 HttpPost 它回复 您没有选择要上传的文件 看来文件字段尚未发送
  • 在 iOS 上的广告中发送蓝牙 LE 数据

    我的应用程序作为蓝牙 LE 外围设备运行 我试图在广告中发送几个字节的自定义数据 func btStartBroadcasting peripheral CBPeripheralManager create an array of byte
  • 词形还原与词干提取之间有什么区别?

    我什么时候使用每个 另外 NLTK 词形还原是否依赖于词性 如果是的话不是更准确吗 短而密 http nlp stanford edu IR book html htmledition stemming and lemmatization
  • AOP::0 处错误,在两种不同方法上应用 aop 的绑定不一致

    我正在尝试在两个不同路径中的两种不同方法上应用 before 方面 class Service1 public Object applyX X x code class Service2 public OtherObject applyY
  • 如何控制 ggplot2 中的 bin 间隔?

    我无法正确控制垃圾箱是否来自例如 10 到 10 或从 0 到 20 当我说binwidth 20我得到前者 但我有从 1 开始的数据 我不希望间隔变为负值 这是我的问题的一个例子 testData data frame x c 1 4 6
  • 在 WPF 中按 Enter 键移动到下一个控件

    我想在 WPF MVVM 应用程序中按 Enter 键而不是 Tab 键时移动到下一个控件 我怎样才能实现这个目标 下面是我为此使用的附加属性 首先 示例用法
  • UITextView 内的动画 Gif

    我看了一下this https stackoverflow com questions 20930462 ios 7 textkit how to insert images inline with text问题 但没有成功 我也在努力避免
  • 在 MySQL 中比较时,转换为 varchar 或 varchar 为 int 更快吗?

    所以我有两个表 它们的 ID 引用同一对象 其中一个表将其存储为 varchar 另一个表将其存储为 int 我想要子查询 或者可能连接 这两个表 WHERE foo CAST bar AS UNSIGNED or WHERE CAST f
  • 睾丸:遇到声明异常

    我在 angular js 中定义了一个空模块 angular module todoList function 然后我想测试它 在我的conf js 我加载这些 javascript files JASMINE JASMINE ADAPT
  • 更改我的所有网站链接:最好的方法是什么? [复制]

    这个问题在这里已经有答案了 可能的重复 htaccess 重写以将根 URL 重定向到子目录 https stackoverflow com questions 990392 htaccess rewrite to redirect roo
  • 我应该如何避免记忆导致 Ruby 中的错误?

    对于如何避免由于可变状态而导致记忆错误是否存在共识 在此示例中 缓存结果的状态发生了变化 因此在第二次调用时给出了错误的结果 class Greeter def initialize greeting cache end def expen
  • Xcode 5 上的项目宽字匹配搜索

    我正在使用 Xcode 5 并且希望不是通过子字符串匹配而是通过精确匹配 或前缀匹配 来查找单词 例如 变量名 在文件范围搜索 Command F 中 我可以通过单击玻璃图标右侧的箭头按钮并选择 编辑查找选项 来使用文本搜索或正则表达式搜索
  • 如何轻松地从 MySQL 迁移到 PostgreSQL?

    我想在现有的 MySQL 数据库 大约 40 个表 400 MB 数据 变得更大之前将其迁移到 Postgres 我在网上搜索并尝试了一些迁移脚本 其中一些可以找到here http wiki postgresql org wiki Con
  • jenkins:通过 Groovy API 设置根 url

    我正在尝试通过 Groovy API 更新 Jenkins 的根 URL 这样我就可以编写 Jenkins master 的部署脚本 而无需手动输入 旁白 为什么像 Jenkins 这样受构建 devops 自动化社区欢迎的工具如此抵制 自
  • C 中的 for 循环和 getchar()

    为什么代码偶数次直接获取到空数据 我不知道发生了什么事 非常感谢 include
  • 将 HTML 表单中的用户输入作为 Python 脚本的变量 [重复]

    这个问题在这里已经有答案了 我正在 Python Flask 中创建一个 Web 应用程序 以使用 tweepy 使用 twitters API 显示推文 我已经设置了一个 HTML 表单 并获得了用于查找具有特定输入的推文的脚本 目前 这
  • ImageButton 位于 ImageView 后面并偏移

    因此 我正在为我的应用程序进行设计 我需要将图像按钮直接放在图像视图下方 但由于我的图像视图周围有一个带有阴影的边框 我需要将图像按钮隐藏 向上移动 在图像视图后面大约 10 个像素 这是我想要的快速绘图 我希望这是有道理的 我一直在尝试各
  • ToString 和字符串连接 - 意外行为

    根据互联网 当你这样做时 String someString object1 object2 object3 ToString 在每个对象上调用 但这并没有发生 这段代码 String a a foo String b b foo ToSt