C# 具有内部实例化的空列表上的扩展方法

C# 具有内部实例化的空列表上的扩展方法,c#,list,extension-methods,argumentnullexception,C#,List,Extension Methods,Argumentnullexception,我可以在可能为空的列表上使用扩展方法吗?如果是这种情况,那么就在扩展方法中实例化它 在应用于列表的扩展方法内实例化列表。。。听起来,当您尝试从列表中添加或删除一个项目时,您正在使用foreach循环进行迭代 public static void AddOrUpdate(this List<blabla> i, Person p) { i = i ?? new List<blabla>(); //Is it OK no instantiate inside? i.Remov

我可以在可能为空的列表上使用扩展方法吗?如果是这种情况,那么就在扩展方法中实例化它


在应用于列表的扩展方法内实例化列表。。。听起来,当您尝试从列表中添加或删除一个项目时,您正在使用foreach循环进行迭代

public static void AddOrUpdate(this List<blabla> i, Person p)
{
i = i ?? new List<blabla>(); //Is it OK no instantiate inside?
i.RemoveAll(t => t.Id == p.Id && t.Role == RoleEnum.Admin);
i.Add(p); //Since it is a reference type, I dont need to return it (even "this" parameter) right?
}
publicstaticvoidaddorupdate(此列表i,个人p)
{
i=i??new List();//内部没有实例化可以吗?
i、 RemoveAll(t=>t.Id==p.Id&&t.Role==RoleEnum.Admin);
i、 Add(p);//因为它是引用类型,所以我不需要返回它(甚至“this”参数),对吗?
}
然后像这样使用它:

//List<blabla> TeamWork comes from anywhere else, instantiated or not
TeamWork.AddOrUpdate(aPersonA);
TeamWork.AddOrUpdate(aPersonB);
DoSomething(Teamwork);
//列表团队来自其他任何地方,无论是否实例化
团队合作。AddOrUpdate(aPersonA);
团队合作。添加或更新(aPersonB);
DoSomething(团队合作);

不,这将不起作用,因为参数应作为
ref
传递,并且不能将
ref
this
关键字组合使用

但你总是可以这样做:

public static List<blabla> AddOrUpdate(this List<blabla> i, Person p)
{
    i = i ?? new List<blabla>();
    i.RemoveAll(t => t.Id == p.Id && t.Role == RoleEnum.Admin);
    i.Add(p);
    return i;
}

TeamWork = TeamWork.AddOrUpdate(aPersonA);
TeamWork = TeamWork.AddOrUpdate(aPersonB);
DoSomething(Teamwork);
publicstaticlist AddOrUpdate(此列表为i,个人为p)
{
i=i??新列表();
i、 RemoveAll(t=>t.Id==p.Id&&t.Role==RoleEnum.Admin);
i、 加(p);
返回i;
}
团队合作=团队合作。添加或更新(aPersonA);
团队合作=团队合作。添加或更新(aPersonB);
DoSomething(团队合作);

好的,没问题。但是新列表()的那部分呢;在extesion方法中?@fernandotores有什么问题?您正在返回列表并将其重新分配给原始变量,如果它是旧实例,它将保持不变,如果它是新实例,引用将被更新,这就是您必须重新分配变量的原因。在应用于它的扩展方法中实例化列表。。。听起来,当您尝试从列表中添加或删除一个项目时,您正在使用foreach循环进行迭代。但你是对的,这只是一个“听起来像”的问题:Pit可以创建扩展方法并在任何地方使用它们来简化编程任务。我认为你不应该那样做。将为其他类似类型的列表创建混乱。最好使用能够满足您需求的包装器类。