Laden...

T zu Byte[]

Letzter Beitrag vor 15 Jahren 24 Posts 1.303 Views
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

cast?

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

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

buffer = value as Byte[];
?

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

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

trotzdem vielen dank für die bisherigen antworten

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[];
        }
    }

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

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);
        
}

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

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.

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

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

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

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?;

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.)

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

das war mir dann schon klar. 😃

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

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.

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

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

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

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

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