Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

frage zu compilerfehler CS0176

46 views
Skip to first unread message

Jonas Sourlier

unread,
Sep 17, 2003, 5:35:04 PM9/17/03
to
hallo!

hab etwas Mühe mit dem Compilerfehler CS0176. Warum kann ich über eine
Instanz nicht auf einen statischen Member zugreifen? Statische Member
sind doch einfach Member, die für alle Instanzen gleich sind, also
sollte man doch auch über ein Instanzenverweis darauf zugreifen
können??

folgendes Problem:


abstract class myBaseClass
{
public static int myStaticField;
}
class myClass1 : myBaseClass
{
public static new int myStaticField = 5;
}
class myClass2 : myBaseClass
{
public static new int myStaticField = 10;
}

//irgendwo folgende Methode

public void myMethod (myBaseClass myObj)
{
int x = myObj.myStaticField; //CS0176
}

//irgendwo folgender Methodenaufruf

myMethod(new myClass1);


ich muss in der Methode myMethod auf das statische Feld myStaticField
zugreifen... die Klasse von myObj weiss ich jedoch nicht, da nicht ein
Objekt vom Typ myBaseClass übergeben wird, sondern eines vom Typ einer
von ihr abgeleiteten Klasse, myClass1 oder myClass2... darum kann ich
nicht schreiben

int x = myBaseClass.myStaticField;


danke für eure Hilfe

gruss Jonas

Frank Seyfried

unread,
Sep 17, 2003, 6:04:52 PM9/17/03
to
Hallo Jonas,

bei der deklaration eines static-member wird dieser member nicht nur auf
eine spezifische Klasseninstanz (Objekt), sondern auf die gesamte Klasse
angewendet. Der Zugriff ist nur über den Klassennamen selbst möglich. Bei
der Erstellung einer Instanz werden static Mitglieder nicht
mitberücksichtigt. Wofür benötigst du das ?

Gruß

Frank

"Jonas Sourlier" <evil_...@gmx.ch> schrieb im Newsbeitrag
news:oqkhmv08sp80nrp8c...@4ax.com...

Frank Seyfried

unread,
Sep 17, 2003, 6:09:59 PM9/17/03
to
sollte natürlich so heissen

> bei der deklaration eines static-member wird dieser member nicht auf


> eine spezifische Klasseninstanz (Objekt), sondern auf die gesamte Klasse
> angewendet.

"Frank Seyfried" <fran...@web.de> schrieb im Newsbeitrag
news:eDSFIfWf...@tk2msftngp13.phx.gbl...

Herfried K. Wagner [MVP]

unread,
Sep 17, 2003, 6:20:22 PM9/17/03
to
Hallo Frank!

"Frank Seyfried" <fran...@web.de> schrieb:


> bei der deklaration eines static-member wird dieser member
> nicht nur auf eine spezifische Klasseninstanz (Objekt), sondern
> auf die gesamte Klasse angewendet. Der Zugriff ist nur über den
> Klassennamen selbst möglich. Bei der Erstellung einer Instanz
> werden static Mitglieder nicht mitberücksichtigt.

Tja, das ist IMO einfach eine lästige Einschränkung von C#. In VB.NET haben
wir das Problem gottseidank nicht:

\\\
Dim b As New Bla()
b.Foo()
.
.
.
Public Class Bla
Public Shared Sub Foo()
MsgBox("Baz")
End Sub
End Class
///

> Wofür benötigst du das ?

LOL... wenn es immer nur darum gehen würde...

--
Herfried K. Wagner
MVP · VB Classic, VB.NET
http://www.mvps.org/dotnet


Günter Prossliner

unread,
Sep 18, 2003, 1:29:23 AM9/18/03
to
Richtige Version:

//irgendwo folgende Methode
public void myMethod (myBaseClass myObj)
{

int x = myBaseClass.myStaticField; //CS0176
} /\/\/\/\/\/\/\/\/\/\

mfg GP

"Jonas Sourlier" <evil_...@gmx.ch> wrote in message
news:oqkhmv08sp80nrp8c...@4ax.com...

Roger Boesch

unread,
Sep 18, 2003, 2:10:20 AM9/18/03
to
> Tja, das ist IMO einfach eine lästige Einschränkung von C#. In VB.NET
haben

Das ist korrekt, es handelt sich nur um eine Einschränkung in C#, In VB, C++
etc. funktioniert das.
Es liegt aber nicht daran, das static bei Instanzen nicht berücksichtigt
würden, sondern ist wie gesagt eine Sprachlimitierung,
die aber nur Klarheit bringt und keine Nachteile, zumindest sehe ich die
nicht.

Habt Ihr ev. ein Praxisbeispiel, wo ich anstatt Klasse.methode() besser
Objekt.Methode() aufrufen sollte,
wenn es sich in beiden Fällen um ein static handelt ?


Frank Seyfried

unread,
Sep 18, 2003, 6:05:50 AM9/18/03
to
Hallo Herfried,

ich glaub ich wechsle schleunigst zu VB.NET das kann ja nicht sein. Was
haben sich die Herren aus der C# Abteilung gedacht ;)

Gruß

Frank


"Herfried K. Wagner [MVP]" <hirf...@m.activevb.de> schrieb im Newsbeitrag
news:us5d9sWf...@tk2msftngp13.phx.gbl...

Frank Seyfried

unread,
Sep 18, 2003, 6:09:51 AM9/18/03
to
Hi,

die frage die ich mir jetzt stelle ist, ob ein Klassenmember im VB.NET im
Konstruktor initialisiert werden kann. Normalerweise sollte das doch nicht
gehen, oder irre ich mich, da es ja ein Klassenmember ist, und kein Member
einer Instanz?

Gruß

Frank

"Roger Boesch" <roger....@multihull.ch> schrieb im Newsbeitrag
news:3f694c4e$1...@news.bluewin.ch...

Frank Seyfried

unread,
Sep 18, 2003, 6:20:48 AM9/18/03
to
Hallo Günter,

was ist aber wenn du zugriff auf die static members einer bestimmten
abgeleiteten klasse benötigst.dort müsstes du für jede klasse diese methode
implementieren, oder ?

gruß

frank


"Günter Prossliner" <g.pros...@gmx.at> schrieb im Newsbeitrag
news:eHIjxWaf...@TK2MSFTNGP11.phx.gbl...

Günter Prossliner

unread,
Sep 18, 2003, 6:58:58 AM9/18/03
to
Ok. Verstehe. Leider kann ich dabei nur auf die anderen Postings in diesem
Thread verweisen, die das als C# Einschränkung deklarieren.

mfg GP

"Frank Seyfried" <fran...@web.de> wrote in message
news:u5gDV6cf...@TK2MSFTNGP11.phx.gbl...

Herfried K. Wagner [MVP]

unread,
Sep 18, 2003, 6:50:32 AM9/18/03
to
Hallo Frank!

"Frank Seyfried" <fran...@web.de> schrieb:


> ich glaub ich wechsle schleunigst zu VB.NET das kann
> ja nicht sein. Was haben sich die Herren aus der C#
> Abteilung gedacht ;)

;-)

Herfried K. Wagner [MVP]

unread,
Sep 18, 2003, 6:50:10 AM9/18/03
to
Hallo Frank!

"Frank Seyfried" <fran...@web.de> schrieb:


> die frage die ich mir jetzt stelle ist, ob ein Klassenmember
> im VB.NET im Konstruktor initialisiert werden kann.
> Normalerweise sollte das doch nicht gehen, oder irre ich
> mich, da es ja ein Klassenmember ist, und kein Member
> einer Instanz?

Was?

\\\
Public Class Bla
Public Shared Foo As Integer
Public Moo As Integer

Public Sub New()
Moo = 22
End Sub

Shared Sub New()
Foo = 99


End Sub
End Class
///

Oder was meinst du?

Frank Seyfried

unread,
Sep 18, 2003, 7:15:35 AM9/18/03
to
ich meinte sowas in der art ;)

Public Class Bla

Public Shared Foo As Integer 'static
Public Moo As Integer

'Konstuktor
Public Sub Bla()
Moo = 22
Foo = 3 <--- geht das ?
End Sub

End Class

gruß

frank

"Herfried K. Wagner [MVP]" <hirf...@m.activevb.de> schrieb im Newsbeitrag

news:e1v##OdfDH...@TK2MSFTNGP11.phx.gbl...

Herfried K. Wagner [MVP]

unread,
Sep 18, 2003, 7:47:09 AM9/18/03
to
Hallo Frank!

"Frank Seyfried" <fran...@web.de> schrieb:


> ich meinte sowas in der art ;)
>
> Public Class Bla
>
> Public Shared Foo As Integer 'static
> Public Moo As Integer
>
> 'Konstuktor
> Public Sub Bla()
> Moo = 22
> Foo = 3 <--- geht das ?
> End Sub
>
> End Class

Ja, natürlich funktioniert das. Aus einem Instanzmember kann man natürlich
auch auf die Shared-Member zugreifen (die ja allen Instanzen gemeinsam
sind).

Joachim Fuchs

unread,
Sep 18, 2003, 9:41:56 AM9/18/03
to
Hallo,

ich verstehe Eure Probleme nicht. Ganz im Gegenteil, ich bin froh, dass man
in C# eine statische Methode nur über den Klassenname aufrufen kann. Die
VB-Variante, die ja aus C++ Zeiten stammt, ist nur verwirrend und bringt
keine Vorteile. In C# sieht man ganz genau an der Art des Methodenaufrufs,
ob die Methode statisch ist oder nicht. Bei VB sieht man das nicht, wenn der
Programmierer diese (unsinnige) Variante verwendet und die Methode über eine
Referenzvariable aufruft.

Gruß
Joachim

Jonas Sourlier

unread,
Sep 18, 2003, 12:36:23 PM9/18/03
to
hallo Frank

danke für deine Antwort

>bei der deklaration eines static-member wird dieser member nicht nur auf
>eine spezifische Klasseninstanz (Objekt), sondern auf die gesamte Klasse
>angewendet. Der Zugriff ist nur über den Klassennamen selbst möglich. Bei
>der Erstellung einer Instanz werden static Mitglieder nicht
>mitberücksichtigt. Wofür benötigst du das ?

hab ich doch eben beschrieben... ich bekomme in einer Methode ein
Objekt als Parameter... ich weiss seine Klasse aber nicht, da die
Klasse, die in der Parameterbeschreibung angegeben ist, nur die
Basisklasse ist von allen Klassen, die eventuell übergeben werden...
aber wäre nett, wenn ihr euch das Problem etwas genauer anschaut:

>>
>>
>> abstract class myBaseClass
>> {
>> public static int myStaticField;
>> }
>> class myClass1 : myBaseClass
>> {
>> public static new int myStaticField = 5;
>> }
>> class myClass2 : myBaseClass
>> {
>> public static new int myStaticField = 10;
>> }
>>
>> //irgendwo folgende Methode
>>
>> public void myMethod (myBaseClass myObj)
>> {
>> int x = myObj.myStaticField; //CS0176
>> }
>>
>> //irgendwo folgender Methodenaufruf
>>
>> myMethod(new myClass1);
>>
>>
>> ich muss in der Methode myMethod auf das statische Feld myStaticField
>> zugreifen... die Klasse von myObj weiss ich jedoch nicht, da nicht ein
>> Objekt vom Typ myBaseClass übergeben wird, sondern eines vom Typ einer
>> von ihr abgeleiteten Klasse, myClass1 oder myClass2... darum kann ich
>> nicht schreiben
>>
>> int x = myBaseClass.myStaticField;

^^^^^^^^^^^^^^^^^^^^^^^^^^^^ geht eben nicht, da ich nicht den
Wert von myBaseClass.myStaticField wissen will, sondern den von
myClass1.myStaticField (sofern ein Objekt von myClass1 übergeben
worden ist....)

versteht jetzt jemand mein Problem?

vielen Dank


Frank Seyfried

unread,
Sep 18, 2003, 3:20:21 PM9/18/03
to
Hi Jonas,

mit "Wöfür benötigst du das" meinte ich, warum der Klassenmember static sein
muss, und für welches Anwendungsgebiet du das brauchst. Wenn du nur den wert
myClass1.myStaticField wissen willst, kann das doch ein normaler Member
verwenden, der evtl. im Konstruktor der Klasse einmalig initialisiert wird.
Da du ein Objekt der MyMethod übergibst, wurde diese ja irgendwann
konstruriert,
sodass die Initialisierung stattgefunden hat.

Wenn der Wert klassenübergreifen gehalten werden muss, kann du auch das
Objekt
selbst static deklarieren.

Ich verwende derzeit nur static Members ,wenn ich kein eigenes Objekt bauen
will oder werte klassenübergreifen halten will.

Gruß

Frank

Jonas Sourlier

unread,
Sep 19, 2003, 12:07:12 PM9/19/03
to

genau das möchte ich... den Wert klassenübergreifend halten... und
anscheinend gibt's keine Möglichkeit, darauf mit einem
Instanzenverweis zuzugreifen

trotzdem danke

gruss Jonas

0 new messages