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# 为什么C不允许对对象进行匿名强制转换?_C#_Linq_Casting_Anonymous Types - Fatal编程技术网

C# 为什么C不允许对对象进行匿名强制转换?

C# 为什么C不允许对对象进行匿名强制转换?,c#,linq,casting,anonymous-types,C#,Linq,Casting,Anonymous Types,我想知道不允许这种转换的原因。这个主题已经在这篇文章中讨论过了,但是我想要一个低层次的解释,解释为什么这在本机上是不可能的 为什么这些类型转换失败 OBS:我知道通过反思是可以做到的 IList<People> peopleList = new List<People>() { new People() { Name = "Again", Age = 10 }, new People() { Name = "Over", Age = 20 }, n

我想知道不允许这种转换的原因。这个主题已经在这篇文章中讨论过了,但是我想要一个低层次的解释,解释为什么这在本机上是不可能的

为什么这些类型转换失败

OBS:我知道通过反思是可以做到的

IList<People> peopleList = new List<People>()
{
    new People() { Name = "Again", Age = 10 },
    new People() { Name = "Over", Age = 20 },
    new People() { Name = "Jonh", Age = 30 },
    new People() { Name = "Enzo", Age = 40 },
};

var anonymous = (from p in peopleList
                select new
                {
                    Name = p.Name,
                    Age = p.Age
                });

// Does not work
IList<People> listt = (IList<People>)anonymous; 
//Does not Work
IList<People> listt = (anonymous as List<People>);
问题是为什么匿名无法成功转换到IList或List

查询表达式的值是可以执行查询的对象。它不是查询执行的结果集。anonymous实现的是IEnumerable,而不是IList,当然它也没有子类型列表。因此,它不能强制转换为任何IList或列表类型。如果这是您想要的,那么使用ToList执行查询并将结果集存储在列表中。 查询是否可以转换为IEnumerable?不是。它是一系列匿名类型的对象,它们复制了与某个人相关的一些值。所以这是一系列匿名对象,而不是一系列人。 我还注意到,在新的C7代码中,如果可以在应用程序中使用元组而不是匿名类型,这是一种更好的做法。它们在类型系统中有更好的支持,并且产生更少的收集压力。

问题是为什么匿名无法成功转换到IList或List

查询表达式的值是可以执行查询的对象。它不是查询执行的结果集。anonymous实现的是IEnumerable,而不是IList,当然它也没有子类型列表。因此,它不能强制转换为任何IList或列表类型。如果这是您想要的,那么使用ToList执行查询并将结果集存储在列表中。 查询是否可以转换为IEnumerable?不是。它是一系列匿名类型的对象,它们复制了与某个人相关的一些值。所以这是一系列匿名对象,而不是一系列人。
我还注意到,在新的C7代码中,如果可以在应用程序中使用元组而不是匿名类型,这是一种更好的做法。它们在类型系统中有更好的支持,并产生更少的收集压力。

我想你认为它应该工作的原因会很有趣。匿名类型不是另一种类型,即使它具有相同的字段。这同样适用于任何其他类型,匿名或非匿名。这就是语言的构建方式,C语言中没有duck类型。为什么它要工作?这是一个匿名类型,不是一个人物实例。从一个演员到另一个演员是无法想象的。Cast意味着将此对象视为其他等效类型。没有任何证据表明这种匿名类型等同于人。如果你用它来表示宠物呢?你的匿名类型不是人,这两种类型之间没有转换。为什么这个演员要工作?编译器应该如何知道如何将用户转换为匿名类型?即使是这样,IList仍然是一种与IList完全不同的类型。它不起作用的低级原因是,它在C语言规范中没有定义为受支持的强制转换。这称为BTW。如果它走路像鸭子,嘎嘎叫像鸭子,就把它当作鸭子对待。除了一些非常特殊的情况外,它在C语言中还不能作为一种一流的语言特性使用。我想这会很有趣,为什么你认为它应该工作。匿名类型不是另一种类型,即使它具有相同的字段。这同样适用于任何其他类型,匿名或非匿名。这就是语言的构建方式,C语言中没有duck类型。为什么它要工作?这是一个匿名类型,不是一个人物实例。从一个演员到另一个演员是无法想象的。Cast意味着将此对象视为其他等效类型。没有任何证据表明这种匿名类型等同于人。如果你用它来表示宠物呢?你的匿名类型不是人,这两种类型之间没有转换。为什么这个演员要工作?编译器应该如何知道如何将用户转换为匿名类型?即使是这样,IList仍然是一种与IList完全不同的类型。它不起作用的低级原因是,它在C语言规范中没有定义为受支持的强制转换。这称为BTW。如果它走路像鸭子,嘎嘎叫像鸭子,就把它当作鸭子对待。除了一些非常特殊的情况外,它在C中不能作为一流的语言特性使用。