C# Linq的let语句将引用设置为null
当使用let in Linq查询时,包含SortedList的特定对象群将这些列表的引用设置为null 下面是一个最低限度的工作示例。大部分只是一系列的事情,以确保它反映了我工作的环境;最重要的部分在最后一行,它抛出一个NullReferenceException,因为testList[1]。元素为nullC# Linq的let语句将引用设置为null,c#,linq,C#,Linq,当使用let in Linq查询时,包含SortedList的特定对象群将这些列表的引用设置为null 下面是一个最低限度的工作示例。大部分只是一系列的事情,以确保它反映了我工作的环境;最重要的部分在最后一行,它抛出一个NullReferenceException,因为testList[1]。元素为null 为什么这是空的?在let中生成匿名对象时会发生什么情况,从而阻止正确复制引用?问题出现在这之前;我尝试了您的代码,并且对于tbcYour ComplexClassA中的每个项,元素都已为nu
为什么这是空的?在let中生成匿名对象时会发生什么情况,从而阻止正确复制引用?问题出现在这之前;我尝试了您的代码,并且对于tbcYour ComplexClassA中的每个项,元素都已为null。我们的ComplexClassA将隐藏基类ComplexClass中的元素。ComplexClass中的元素为null,并且您的字典引用的是ComplexClass,因此它可以看到null元素。这就是为什么您应该避免使用“新建”而不是“虚拟”和“覆盖”的设计。如果您执行ComplexClassaseTList[1].Elements.Count操作,它将起作用,因为这将强制它查看ComplexClassA中不为空的元素。^此-请参阅,谢谢,@juharr。我认为这可能是不鼓励隐藏的原因之一。另一方面,我不能使用override代替new,因为这不允许像上面那样更改SORTEDLIST。但是,为了允许在ComplexClass上定义泛型方法,我认为没有办法在ComplexClass中定义列表并隐藏它。有什么建议吗?@Informagic基本上你需要使用泛型。所以ComplexClass:ComplexBase,其中T:ComplexElement,然后SortedList元素{get;set;},最后是ComplexClassA:ComplexClass,您不必再次定义元素。虽然你需要一个共同变体的接口来让BigColleciton正常工作,但我实在没有空间来讨论这个问题。所以试一下,如果你遇到更多的问题,就发一个新问题。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TypecastTest {
public abstract class ComplexBase { }
public abstract class ComplexClass : ComplexBase {
internal SortedList<string, ComplexElement> Elements { get; set; }
}
public abstract class ComplexElement : ComplexBase { }
public class ComplexClassA : ComplexClass {
internal new SortedList<string, ComplexElementA> Elements { get; set; }
public ComplexClassA() {
Elements = new SortedList<string, ComplexElementA>();
}
}
public class ComplexElementA : ComplexElement { }
public class ComplexClassB : ComplexClass {
internal new SortedList<string, ComplexElementB> Elements { get; set; }
public ComplexClassB() {
Elements = new SortedList<string, ComplexElementB>();
}
}
public class ComplexElementB : ComplexElement { }
public class TheBigCollection {
internal SortedList<string, ComplexClass> Classes { get; set; }
public TheBigCollection() {
Classes = new SortedList<string, ComplexClass>();
}
}
class Program {
static void Main(string[] args) {
ComplexClassA ccA1 = new ComplexClassA();
ComplexElementA ceA1a = new ComplexElementA();
ComplexElementA ceA1b = new ComplexElementA();
ccA1.Elements.Add("A1a", ceA1a);
ccA1.Elements.Add("A1b", ceA1b);
ComplexClassA ccA2 = new ComplexClassA();
ComplexElementA ceA2a = new ComplexElementA();
ComplexElementA ceA2b = new ComplexElementA();
ccA2.Elements.Add("A2a", ceA2a);
ccA2.Elements.Add("A2b", ceA2b);
ComplexClassB ccB1 = new ComplexClassB();
ComplexElementB ceB1a = new ComplexElementB();
ComplexElementB ceB1b = new ComplexElementB();
ccB1.Elements.Add("B1a", ceB1a);
ccB1.Elements.Add("B1b", ceB1b);
ComplexClassB ccB2 = new ComplexClassB();
ComplexElementB ceB2a = new ComplexElementB();
ComplexElementB ceB2b = new ComplexElementB();
ccB2.Elements.Add("B2a", ceB2a);
ccB2.Elements.Add("B2b", ceB2b);
TheBigCollection tbc = new TheBigCollection();
tbc.Classes.Add("1", ccA1);
tbc.Classes.Add("2", ccA2);
tbc.Classes.Add("3", ccB1);
tbc.Classes.Add("4", ccB2);
var query = from kvp in tbc.Classes
let tmp = new {
tmpKey = kvp.Key,
tmpValue = kvp.Value
}
select tmp;
Dictionary<string, ComplexClass> testDictionary = query.ToDictionary(x => x.tmpKey, x => x.tmpValue);
SortedList<string, ComplexClass> testList = new SortedList<string, ComplexClass>(testDictionary);
int test = testList["1"].Elements.Count;
}
}
}