Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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# Linq的let语句将引用设置为null_C#_Linq - Fatal编程技术网

C# Linq的let语句将引用设置为null

C# Linq的let语句将引用设置为null,c#,linq,C#,Linq,当使用let in Linq查询时,包含SortedList的特定对象群将这些列表的引用设置为null 下面是一个最低限度的工作示例。大部分只是一系列的事情,以确保它反映了我工作的环境;最重要的部分在最后一行,它抛出一个NullReferenceException,因为testList[1]。元素为null 为什么这是空的?在let中生成匿名对象时会发生什么情况,从而阻止正确复制引用?问题出现在这之前;我尝试了您的代码,并且对于tbcYour ComplexClassA中的每个项,元素都已为nu

当使用let in Linq查询时,包含SortedList的特定对象群将这些列表的引用设置为null

下面是一个最低限度的工作示例。大部分只是一系列的事情,以确保它反映了我工作的环境;最重要的部分在最后一行,它抛出一个NullReferenceException,因为testList[1]。元素为null


为什么这是空的?在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;
    }
  }
}