【发布时间】:2023-03-12 15:14:01
【问题描述】:
我遇到了 LINQ 的一个奇怪的行为,除了我不明白的方法。我可以完全以不同的方式重写我的代码以使其正常工作,这不是我的问题。我只是想了解它为什么会失败:
public void MyMethod(MyClass whatever, params object[] values){ // called with values = [ "mystr1", "mystr2", true, true ]
var valuesOfType = values.OfType<MyType>().ToList(); // valuesOfType is Empty List Count = 0
values = values.Except(valuesOfType ).ToArray(); // values = [ "mystr1", "mystr2", true ]
}
所以 values 的最后一个元素通过使用带有空列表的 except() 消失了!这怎么可能?
我再次在调试器中重新运行该行,它没有被中继到 2 个元素。自分配给values 不是问题,我用另一个变量尝试过,它仍然是trunkates。这里发生了什么?
PS:
MyType 只是一个简单的类型,只有一个 get 属性。
虽然问题已经得到解答,但如果有人想亲自看看,这里有一个可复制的控制台应用程序:
namespace ConsoleApp1
{
using System;
using System.Linq;
class Program
{
static void Main(string[] args)
{
var para = new object[] {"str1", "str2", true, true};
var temp = new TestClass(new Dummy1(), para);
}
public class TestClass
{
public TestClass(Dummy1 dummy1, params object[] values)
{
var valuesOfType = values.OfType<Dummy2>().ToList();
values = values.Except(valuesOfType).ToArray();
foreach (var value in values)
{
Console.WriteLine(value);
}
Console.ReadKey();
}
}
public class Dummy1
{
}
public class Dummy2
{
}
}
}
【问题讨论】: