2016-07-06 2 views
0

Ich verwende einen Stapel, um Kartenobjekte zu speichern, aber ich finde keine Möglichkeit, den Stapel entweder dazu zu bringen, ein Kartenobjekt zu öffnen oder ein System.object in mein Kartenobjekt zu konvertieren.Konvertieren von System.Object in benutzerdefiniertes Objekt nach Verwendung in einem Stapel?

Der Fehler Ich erhalte: Fehler CS0266 nicht implizit Typ konvertieren kann ‚Objekt‘ auf ‚Karte‘

So sehe ich es in ein wenig mehr, und es stellt sich heraus, dass ich keine Ahnung, was Boxen hatte und Unboxing waren aber ich schaffte es, es nur durch Hinzufügen (Karte) vor dem Pop() zu beheben, danke für die Hilfe, die jeder !!

+0

Jede Instanz kann in C# (oder "boxed") an den Objekttyp übergeben werden ein solcher Typ). Und der Stapel hat die Pop/Peek-Methoden, um das zu tun, was Sie tun möchten. Bitte poste den Code, bei dem du das Problem hast, damit wir ein wenig besser verstehen, was du versuchst. –

+0

Willkommen bei StackOverflow! Ich glaube nicht, dass irgendjemand weiß, wovon genau du redest. Kannst du bitte etwas Code zeigen? –

+0

Was hast du schon probiert? Welche Fehler hast du? Stellen Sie uns einen Code zur Verfügung, sonst können wir Ihnen nicht helfen. – cverb

Antwort

2

Sie konnten einen generischen Stapel

https://msdn.microsoft.com/de-de/library/3278tedw(v=vs.110).aspx

Für

Beispiel verwenden
using System.Collections.Generic; 

var stack = new Stack<Card>(); 
stack.Push(new Card()); 

Card card = stack.Pop() 

sollte das tun, was Sie wollen.

EDIT:

Ok, nach dem Bearbeiten denke ich, ist das Problem hier:

object temp; 
object[] array = new object[n]; 

... 
array[swp2] = temp; 
... 

Stack<Card> r = new Stack<Card>(); 
r.Push(array[i]); 

Sie sind wirklich ein Objekt in den Stapel schieben. Ich wundere mich wirklich, dass dieser Code kompilieren kann. In Visual Studio ist dies nicht möglich.

Eine einfache Lösung ist die Verwendung von Karte/Karte [] anstelle von Objekt dort.

Durch die Art, wie ich ein anderes Problem in Ihrem Code sehen:

Keeper temp = new Keeper(); 

temp.id = 1; 
temp.name = "The Ball"; 
deck.Push(temp); 

temp.id = 2; 
temp.name = "The Stick"; 
deck.Push(temp); 

Temp immer Verweise auf die gleiche Instanz. In den folgenden Zeilen editierst du also nur die Werte des gleichen Bewahrers/Aktion/was auch immer und drückst den gleichen Verweis immer wieder.

+0

Ahh okay, ich bin zu sehr an die verlinkte java-Liste gewöhnt, also dachte ich, es würde genauso funktionieren. Nur um sicherzustellen, dass ich das richtig verstehe, wenn ich temp tue, speichert es nicht die Daten für temp im Stapel?Weil ich versuche, nur den Stapel für die Datenspeicherung zu verwenden. – Kightel

+0

Wenn Sie Push() aufrufen, wird nur ein Verweis auf Ihre Daten gespeichert! Sie müssen temp = new Keeper() zwischen Push und dem Datenänderungscode aufrufen. – ErWu

+0

Okay, ich füge das jetzt hinzu und danke für die Hilfe! – Kightel

0

Wenn Sie wirklich denken, Sie brauchen Stack<Object> zu verwenden, eine einfache as funktionieren würde:

var st = new Stack<object>(); 
st.Push("abc"); 
string str = st.Pop() as string; 

Wenn Sie verwenden:

Stack st1 = new Stack(); 

Sie eine Richtlinie hinzufügen können using System.Collections.Generic; und Verwendung:

Stack<Card> st1 = new Stack<Card>(); 
Verwandte Themen