【发布时间】:2019-12-17 23:23:52
【问题描述】:
我正在尝试制作一个非常简单的扩展方法,它只是从列表中删除空值。
看起来像这样:
private static List<T> RemoveNulls<T>(this List<T> list) where T : new()
{
List<T> newList = list.FindAll(x => x != null);
return newList;
}
真的很简单。我这样称呼它:
foundNeighbors.RemoveNulls();
但有时我仍然返回一个带有空值的列表。这应该是不可能的吧?我是否遗漏了一些关于扩展方法的内容?
【问题讨论】:
-
看起来你应该这样称呼它:
foundNeighbors = foundNeighbors.RemoveNulls(); -
您能谈谈为什么您向
T添加了一个看似不必要的默认构造函数约束吗?这似乎是一件奇怪的事情。 -
您能否也谈谈为什么您使用
FindAll来尝试从列表中删除项目而不是RemoveAll?我有兴趣了解人们是如何犯这些错误的,以便我可以设计更好的对象模型。 -
@kuskmen:考虑一个人为的例子:
class X { static X x = new X() { P = 1 } public int P { set { Console.WriteLine(X.x == null); } }我们希望这应该具有X t = new X(); t.P = 1; X.x = t;的语义,以便设置器观察到X.x仍然为空。如果这具有X x = new X(); x.P = 1;的语义,那就太奇怪了,因为现在对X.x的赋值发生在在赋值表达式右侧完成之前,并且这个事实是可以观察到的。 -
@OmniOwl:感谢您的解释。我显然需要使用不可为空的功能。我会尝试你的方案,如果我发现任何相关的东西,我会报告回来。
标签: c# linq extension-methods