【问题标题】:In C#, I would love to define the > and < operators for string [duplicate]在 C# 中,我很想为字符串定义 > 和 < 运算符 [重复]
【发布时间】:2021-03-17 17:05:36
【问题描述】:

就我个人而言,我觉得 string.CompareTo() 使用和阅读都很烦人。

我喜欢阅读和写作:if (string1 &gt; string2)

目前,我可以使用 ExtensionMethods 这个

        string a = "ABC";
        string b = "BBC";

        if ( a.IsGreaterThan(b) )
        {
            Console.WriteLine("a is greater than b");
        } 
        else if ( a.IsLessThan(b) )
        {
            Console.WriteLine("a is less than b");
        }
    public static class StringExtensions
    {
        public static bool IsGreaterThan(this string i, string value)
        {
            return (i.CompareTo(value) > 0);
        }

        public static bool IsLessThan(this string i, string value)
        {
            return (i.CompareTo(value) < 0);
        }
    }

这好多了,但我仍然想定义 运算符。我发现一篇旧帖子解释了为什么这是不可能的:

目前不支持,因为扩展方法是在单独的静态类中定义的,静态类不能有运算符重载定义。

C# 中是否有任何更改现在允许为字符串类定义 运算符?

【问题讨论】:

  • 没有。什么都没有改变,而且可能永远不会。我很高兴这是不可能的,因为人们会用它来做数学。
  • 我很高兴我可以加载一个 DLL 并确保它不会改变我的字符串比较。
  • 我宁愿使用(或实现自定义比较)IComparer&lt;String&gt;。我们可以用许多不同的方式比较字符串:区分大小写和不区分大小写、自然和字典顺序;某些文化有特殊要求(例如在比较时用芬兰语W == V)等。不可能对所有情况实施一个“标准”&lt;&gt; 比较

标签: c# string operator-keyword


【解决方案1】:

我还是想定义 操作符

但为什么是 [.gifv]?

一个字符串“大于”另一个字符串对您意味着什么?它的长度?还是其中的第一个 Unicode 代码点高于第一个字符串中相同位置的代码点?

组合字符呢? ñ (U+00F1) 是大于还是小于 n~ 的组合(U+006E 和 U+0303),还是相等? i + jij 呢?当前的文化重要吗?

很高兴有这样一种“笨拙”的方法来进行比较,因此您可以对其调用重载来指定您真正想要的比较类型。在字符串比较中没有一种适合所有情况的大小,您绝对不能为所有字符串覆盖它。

此外,已编译的代码并不关心扩展方法(或扩展运算符,如果有的话)。考虑到您正在运行库代码,您肯定可以在其中读到 if (foo &lt; bar) 并且在您的代码中它是 true,但在编译后的代码中它是 false,因为它的作用不同同一运算符的比较。

所以不,C# 不允许覆盖内置类型的运算符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-22
    • 2015-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-07
    • 1970-01-01
    相关资源
    最近更新 更多