Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#运算符重载用法_C#_Overloading_Operator Keyword - Fatal编程技术网

c#运算符重载用法

c#运算符重载用法,c#,overloading,operator-keyword,C#,Overloading,Operator Keyword,所以,我从来没有使用过操作符的重载功能,我试图弄清楚如何将对象从我的类(Person)添加到我的集合类(ListOfPeople)中 ListOfPeople包含一个属性List PeopleList 我的困难在于如何在这个方法中获得一个预先存在的列表,以便向其中添加一个新人ListOfPeople temp=新的ListOfPeople(x) 这一行有一个错误,因为我并没有接受ListOfPeople参数的构造函数。如果我让它成为ListOfPeople temp=newlistofPeopl

所以,我从来没有使用过操作符的重载功能,我试图弄清楚如何将对象从我的类(Person)添加到我的集合类(ListOfPeople)中

ListOfPeople包含一个属性
List PeopleList

我的困难在于如何在这个方法中获得一个预先存在的列表,以便向其中添加一个新人<代码>ListOfPeople temp=新的ListOfPeople(x)

这一行有一个错误,因为我并没有接受ListOfPeople参数的构造函数。如果我让它成为
ListOfPeople temp=newlistofPeople()然后Temp会调用我的默认构造函数,在这里我只创建一个新的空列表,这也不允许我添加到一个预先存在的列表中

我只是不确定如何让“temp”实际引用我之前存在的列表。

使用如下:

public static ListOfPeople operator +( ListOfPeople x, Person y)
    {
        ListOfPeople temp = new ListOfPeople(x);
        if(!temp.PeopleList.Contains(y))
        {
            temp.PeopleList.Add(y);
        }
        temp.SaveNeeded = true;
        return temp;
    }
  • 第一个允许您使用:
    list=list+person
  • 第二个允许您使用:
    list=person+list
您可能还希望重载
+=
运算符(非静态),以便可以使用
list+=person

编辑 虽然我解决了上面提到的问题。但是,我同意其他人关于“+”的操作数是不可变的

下面是对现有代码的更新(假设
ListOfPeople.PeopleList是List
):

使用方法如下:

public static ListOfPeople operator +( ListOfPeople x, Person y)
    {
        ListOfPeople temp = new ListOfPeople(x);
        if(!temp.PeopleList.Contains(y))
        {
            temp.PeopleList.Add(y);
        }
        temp.SaveNeeded = true;
        return temp;
    }
  • 第一个允许您使用:
    list=list+person
  • 第二个允许您使用:
    list=person+list
您可能还希望重载
+=
运算符(非静态),以便可以使用
list+=person

编辑 虽然我解决了上面提到的问题。但是,我同意其他人关于“+”的操作数是不可变的

下面是对现有代码的更新(假设
ListOfPeople.PeopleList是List
):


您不应该使用+运算符将项添加到集合中。我相信这是一个不应该使用运算符重载的例子,它是在集合类中的列表中添加一个对象。这还是同样糟糕吗?是的,看看其他.NET列表是如何实现添加项的,它总是通过
Add
方法实现的;但是如果我做了-我就不会做
包含
检查。如果有人想多次添加它,这是他们的问题。您不应该使用+运算符将项添加到集合中。我相信这是一个不应该使用运算符重载的例子,它是在集合类中的列表中添加一个对象。这还是同样糟糕吗?是的,看看其他.NET列表是如何实现添加项的,它总是通过
Add
方法实现的;但是如果我做了-我就不会做
包含
检查。如果有人想多次添加它,这就是他们的问题。我认为定义++后,+=是隐式的?我的错。对<代码>+=
解析为
+
。LH操作数取决于+=。看,我真的会阻止这样的事情!它意味着没有给予的东西!对于(a+b),我希望a保持不变,并得到一个新的结果。使用您的代码,列表将更改,无论您是否指定值!同意@justanotheruseYouknow写的:)我认为+=是隐含的,一旦你定义了+?我的错。对<代码>+=
解析为
+
。LH操作数取决于+=。看,我真的会阻止这样的事情!它意味着没有给予的东西!对于(a+b),我希望a保持不变,并得到一个新的结果。使用您的代码,列表将更改,无论您是否指定值!同意@justanotheruseYouknow所写的:)
public static ListOfPeople operator +( ListOfPeople x, Person y)
{
    ListOfPeople temp = new ListOfPeople();
    temp.PeopleList.addRange(x);
    if(!temp.PeopleList.Contains(y))
    {
        temp.PeopleList.Add(y);
    }
    temp.SaveNeeded = true;
    return temp;
}

public static ListOfPeople operator +( Person y, ListOfPeople x)
{
    ListOfPeople temp = new ListOfPeople();
    temp.PeopleList.addRange(x);
    if(!temp.PeopleList.Contains(y))
    {
        temp.PeopleList.Add(y);
    }
    temp.SaveNeeded = true;
    return temp;
}