Angenommen, Sie haben eine Grundklasse Employee
als solche:
class Employee
{
public string Name;
public int Years;
public string Department;
}
Dann habe ich (in einer separaten Klasse) die folgenden Codefragmente (ich glaube, ich verstehe alle bis auf die letzten):
Ich glaube, dass das folgende Codefragment funktioniert, weil der Array-Initilierer ein Array von Employee-Objekten erstellt, die vom selben Typ sind wie die Workforce-Variable, der zugewiesen wird.
Employee[] workforceOne = new Employee[] {
new Employee() { Name = "David", Years = 0, Department = "software" },
new Employee() { Name = "Dexter", Years = 3, Department = "software" },
new Employee() { Name = "Paul", Years = 4, Department = "software" } };
Ich habe dann das folgende Codefragment. Ich glaube, dass dies funktioniert, weil die Array- Employee
Objektimplizität eine Implementierung der Array () -Klasse ist, die implementiert wird IEnumerable
. Daher glaube ich, dass das Array aus diesem Grund IEnumerable zugewiesen werden kann.
IEnumerable workforceTwo = new Employee[] {
new Employee() { Name = "David", Years = 0, Department = "software" },
new Employee() { Name = "Dexter", Years = 3, Department = "software" },
new Employee() { Name = "Paul", Years = 4, Department = "software" } };
Dann habe ich dieses Codefragment:
IEnumerable<Employee> workforceThree = new Employee[] {
new Employee() { Name = "David", Years = 0, Department = "software" },
new Employee() { Name = "Dexter", Years = 3, Department = "software" },
new Employee() { Name = "Paul", Years = 4, Department = "software" } };
Ich bin nicht sicher, warum dieses Codefragment funktioniert? IEnumerable<Employee>
erbt von IEnumerable
der GetEnumerator()
Methode (und überschreibt sie (oder überschreibt sie?) ), aber sollte ich deshalb keine Besetzung benötigen, damit die oben genannten als solche funktionieren:
//The cast does work but is not required
IEnumerable<Employee> workforceFour = (IEnumerable<Employee>)new Employee[] {
new Employee() { Name = "David", Years = 0, Department = "software" },
new Employee() { Name = "Dexter", Years = 3, Department = "software" },
new Employee() { Name = "Paul", Years = 4, Department = "software" } };
Es scheint, dass das Array implizit von einem Typ IEnumerable
auf " down" übertragen wird , IEnumerable<Employee>
aber ich dachte immer, wenn Sie einen Typ in etwas Spezifischeres konvertieren müssen, benötigen Sie einen expliziten Cast.
Vielleicht fehlt mir hier etwas Einfaches in meinem Verständnis, aber kann mir bitte jemand bei meinem Verständnis helfen?
Vielen Dank.
workforceThree
Fragment.Antworten:
Aus der Dokumentation :
So Ihre
Employee[]
GeräteIEnumerable<Employee>
.quelle
Das Array of Employees implementiert standardmäßig
IEnumerable<Employee>
auchIEnumerable
quelle
Explizite Besetzung ist erforderlich, wenn ein Satz herabgestuft werden muss . Das heißt, ein Objekt wird in einen spezialisierteren Typ umgewandelt - wenn das Objekt von einem solchen spezialisierten Typ ist -.
Auf der anderen Seite benötigt Upcasting (Casting auf einen weniger spezialisierten Typ) niemals eine explizite Besetzung, aber Sie können dies explizit tun (es ist einfach nutzlos).
Da Array
IEnumerable
und implementiertIEnumerable<T>
, führen Sie einen Upcast in Ihrem Code durch, was bedeutet, dass Sie nicht explizit in umwandeln müssenIEnumerable<T>
.quelle