Οι δύο κλήσεις είναι απολύτως ταυτόσημες. Αυτό μπορείς να το δεις και αν κοιτάξεις το il που δημιουργείται για τις δύο κλήσεις, ο οποίος είναι ακριβώς ο ίδιος. Για τον παρακάτω κώδικα:
Stack stack = new Stack();
stack.Push(new Class1());
Class1 next;
next = (Class1)stack.Peek();
Class1 next2 = (Class1)stack.Peek();
Δημιουργείται το παρακάτω IL:
.maxstack 2
.locals init (
[0] class [mscorlib]System.Collections.Stack stack,
[1] class StackTest.Class1 next,
[2] class StackTest.Class1 next2)
L_0000: nop
L_0001: newobj instance void [mscorlib]System.Collections.Stack::.ctor()
L_0006: stloc.0
L_0007: ldloc.0
L_0008: newobj instance void StackTest.Class1::.ctor()
L_000d: callvirt instance void [mscorlib]System.Collections.Stack::Push(object)
L_0012: nop
L_0013: ldloc.0
L_0014: callvirt instance object [mscorlib]System.Collections.Stack::Peek()
L_0019: castclass StackTest.Class1
L_001e: stloc.1
L_001f: ldloc.0
L_0020: callvirt instance object [mscorlib]System.Collections.Stack::Peek()
L_0025: castclass StackTest.Class1
L_002a: stloc.2
To next δημιουργείται στις γραμμές L_0013-L_001e ενώ το next2 στις γραμμές L_001f-L_002a. Όπως βλέπεις, ο κώδικας είναι ακριβώς ο ίδιος.
Υποψιάζομαι ότι δεν έχει καταλάβει πως δουλεύουν οι κλάσεις και οι μεταβλητές. Για να δημιουργήσεις ένα καινούριο αντικείμενο της κλάσης Class1 πρέπει οπωσδήποτε να χρησιμοποιήσεις το keyword new. Υποψιάζομαι ότι στον κώδικα σου δεν έχεις κάνει new τη μεταβλητή stack γι αυτό και σου εμφανίζει το πρόβλημα. Πρέπει δηλαδή να γράψεις ό,τι γράφω κι εγώ στην πρώτη γραμμή του κώδικα. Όταν γράφεις Class1 next, απλά λες στον compiler ότι κάποια στιγμή θα φτιάξεις ένα αντικείμενο, χωρίς να το φτιάχνεις εκείνη τη στιγμή.
Από εκεί και πέρα, είτε ορίσεις τη μεταβλητή σε μία γραμμή και της δώσεις τιμή στην επόμενη, είτε κάνεις και τα δύο βήματα στην ίδια γραμμή, ο κώδικας που δημιουργείται όπως είδες είναι ακριβώς ο ίδιος.
Παναγιώτης Καναβός, Freelancer
Twitter: http://www.twitter.com/pkanavos