Laden...

T zu Byte[]

Erstellt von Dragon-Sword vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.287 Views
D
Dragon-Sword Themenstarter:in
125 Beiträge seit 2008
vor 14 Jahren
T zu Byte[]

Hallo zusammen,

wer hat eine Idee wie folgendes funktioniert:


Byte[] buffer;

public void Test<T>(T value)
{
  if(typeof(T) == typeof(Byte[]))
  {
    buffer = value;
  }
}

private void btnClick(object sender, EventArgs e)
{
  Byte[] b = new Byte[]{1,2,3};
  Test<Byte[]>(b);
}


'buffer = value;' geht nicht

203 Beiträge seit 2006
vor 14 Jahren

cast?

if(value is Byte[]) buffer = (Byte [])value

aber wahrscheinlich klatscht das auch. kann es gerade nicht testen.

I
302 Beiträge seit 2008
vor 14 Jahren

buffer = value as Byte[];
?

203 Beiträge seit 2006
vor 14 Jahren

buffer = value as Byte[];
? nee, das geht nicht, da Byte ein valuetype ist
gelogen.

D
Dragon-Sword Themenstarter:in
125 Beiträge seit 2008
vor 14 Jahren

wenn es so einfach gegangen währe, hätte ich wohl kaum hier ein thema erstellt.

trotzdem vielen dank für die bisherigen antworten

I
302 Beiträge seit 2008
vor 14 Jahren

so gehts zumindest bei mir in jedem fall...


class Program
    {
        static Byte[] buffer;
        static void Main(string[] args)
        {
            Byte[] b = new Byte[] { 1, 2, 3 };
            Test<Byte[]>(b);
            if (buffer == null)
                return; //...
        }

        public static void Test<T>(T value)
        {
            Byte[] buffer = value as Byte[];
        }
    }

D
Dragon-Sword Themenstarter:in
125 Beiträge seit 2008
vor 14 Jahren

aus welchem Grund funktioniert es mit "as Byte[]" und nicht mit "(Byte[])"?

203 Beiträge seit 2006
vor 14 Jahren

ist zwar nicht ganz das selbe, aber vielleicht hilft es ja (irgendwie)


public static void Test<T>(T[] value) where T : IConvertible
{
    byte[] buffer = new byte[value.Length];
    for(int i = 0; i < value.Length; i++)
        buffer[i] = value[i].ToByte(System.Globalization.CultureInfo.InvariantCulture);
        
}

2.891 Beiträge seit 2004
vor 14 Jahren

Hallo Rätselfreunde,

'buffer = value;' geht nicht

Wirklich tolle Fehlerbeschreibung... 😦

Verwirr den Compiler, dann geht's:

buffer = (byte[])(object)value;

Du solltest dir aber überlegen, warum du das wirklich so Quick'n'Dirty machen willst. Warum machst du die Methode überhaupt generisch, wenn du doch einen bestimmten Typen brauchst? Ergibt irgendwie keinen Sinn...

Gruß,
dN!3L

I
302 Beiträge seit 2008
vor 14 Jahren

sollte genauso gehen... mit as spart man sich nur das prüfen auf den typ. allerdings muss man auf null prüfen. eigentlich gehüpft wie gesprungen.

2.891 Beiträge seit 2004
vor 14 Jahren

Hallo the-cook,

aus welchem Grund funktioniert es mit "as Byte[]" und nicht mit "(Byte[])"? Byte[] ist ein Referenztyp. T könnte auch ein Werttyp sein, deshalb kann man nicht einfach casten. Der as-Operator gibt immer einen Referenztyp zurück.

Gruß,
dN!3L

203 Beiträge seit 2006
vor 14 Jahren

ich denke mal, so lange es ein referenz typ ist, kannst du mit as alles casten, da der wirkliche check erst zur laufzeit gemacht wird, wohingegen degen der syntaxchecker mit (byte[]) schon vorher prüft, ob der cast überhaupt möglich sein kann.
aber zur original frage
wäre es nicht sinvoller sowieso folgendes zu machen

public static void Test(object value) { ... }

wenn man sich intern erst gar nicht im klaren ist, was als typ reinkommt und man casten will

I
302 Beiträge seit 2008
vor 14 Jahren

warum sollte das mit nicht ref-typen nicht gehen? int x = (int)value;

203 Beiträge seit 2006
vor 14 Jahren

warum sollte das mit nicht ref-typen nicht gehen? int x = (int)value;

Weil dann "Cannot convert type T to 'int'" geworfen wird!
Müsste es schon so schreiben

int? x = value as int?;
2.891 Beiträge seit 2004
vor 14 Jahren

Müsste es schon so schreiben

int? x = value as int?;  

Womit es wieder ein Referenztyp wird (Nullable<int>).
(Man kann einem Wertetyp einfach kein null zuweisen.)

I
302 Beiträge seit 2008
vor 14 Jahren

das ist mit schon klar, dafür prüft man vorher ja den datentyp auf int

203 Beiträge seit 2006
vor 14 Jahren

das war mir dann schon klar. 😃

203 Beiträge seit 2006
vor 14 Jahren

das ist mit schon klar, dafür prüft man vorher ja den datentyp auf int was meinst du?

I
302 Beiträge seit 2008
vor 14 Jahren

fall ich etwas zu Integer casten möchte teste ich vorher ob es sich dabei um einen Integer-Typ handelt.

Mit dem "as" war ja auch für den Byte[] - Fall gedacht. Ich verwende das recht häufig, da es recht kurz ist und gleichzeitig eine überprüfung auf null danach ausführen kann.

203 Beiträge seit 2006
vor 14 Jahren

das kannst du aber nur bei variablen vom typ object tun - also (int)value - oder hab ich was übersehen?

I
302 Beiträge seit 2008
vor 14 Jahren

ja genau...da hatten wir aneinander vorbei geredet.

1.665 Beiträge seit 2006
vor 14 Jahren

Um den as Operator bei Generika zu verwenden, reicht es aus, ein where : class
anzuhängen.
Eine Klasse ist immer ein Referenz-Typ und deswegen kann dann auch der Operator benutzt werden.

public void<T> Test() where T : class
Z
457 Beiträge seit 2007
vor 14 Jahren

War das nur etwas Beispielcode oder sehe ich es gerade falsch, dass die Prüfung nicht viel Sinn macht?

Du gibst ja für das T schon expliziet den Typ Byte[] vor. Also ist das übergebene Objekt auch mit sicherheit vom Type Byte[].

Wenn das nur der Veranschaulichung diente habe ich nichts gesagt ^^.

mfg
Zebes

203 Beiträge seit 2006
vor 14 Jahren

wahrscheinlich gibt es irgendwo noch so einen aufruf


Test<int[]>(new int[] { 1, 2, 3});
// bzw
Test<MyObject>(new MyObject());

aber sinn macht es so oder so nicht 😃 vorallem hinten dran der template code ja kopiert wird