【问题标题】:how can override + operator for HashSet<T> in c#如何在 c# 中为 HashSet<T> 覆盖 + 运算符
【发布时间】:2019-12-17 09:35:35
【问题描述】:

我们可以覆盖现有类的任何操作(例如:'+')? 我想要覆盖 + 操作以合并 2 HashSet 并删除重复值。

在这种情况下,我想为 HashSet 覆盖 + 操作,但我不知道如何为现有类实现 + 操作。 互联网上的所有教程都为一个新类实现了运算符。给定SetHash的泛型类型,如何进行+操作?

我创建了一个类来实现 + 运算符:

    public static HashSet<T> operator +(HashSet<T> left, HashSet<T> right)  where T : class
    {
        return left.Union(right);
    } 

但不起作用并给出许多错误(23 个错误)。其中一些是:

.operator +(HashSet, HashSet)' 必须声明一个主体,因为它没有标记为抽象、外部或部分

我想我可以用扩展方法解决这个问题,但我不确定

【问题讨论】:

    标签: c# operator-overloading hashset


    【解决方案1】:

    运算符重载显式仅适用于用户定义的类型。它实际上是1st sentence。但是,您可以创建一个继承自 HastSet&lt;T&gt; 的类 - 毕竟它不是密封的。唯一目的是添加该功能/覆盖。

    public class AddAbleHashSet<T> : HashSet<T> {
        public static HashSet<T> operator +(HashSet<T> left, HashSet<T> right)  where T : class
        {
            return left.Union(right);
        } 
    }
    

    P.S.:我不确定该函数的 where T : class 限制在做什么。您正在合并两个哈希集。 T 型对此根本不重要。我实际上不确定这在那里是否有效。

    【讨论】:

    • 你是对的;我必须删除where T : class,但是给我一个错误一个二元运算符的参数必须是包含类型
    • 当然实际上应该是left.UnionWith(right); return left;。 (HashSet 不包含一个名为“Union()”的方法 - 相反,它包含一个名为“UnionWith()` 的方法,它不返回任何内容。)
    • 我将创建并返回一个新的 HashSet,因为您不希望更改输入操作数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-05
    • 2011-04-12
    • 1970-01-01
    • 2011-08-15
    • 1970-01-01
    • 2010-12-26
    相关资源
    最近更新 更多