sirve - tamaño de int c#
sbyte[] se puede convertir mágicamente a byte (1)
No, no es un error. Es solo una discrepancia de impedancia entre las reglas del lenguaje C # (que afirman que no hay conversión disponible) y las reglas CLR (donde la conversión está disponible).
Tenga en cuenta que el compilador realmente, realmente piensa que sabe mejor:
byte[] bytes = new byte[10];
// error CS0030: Cannot convert type ''byte[]'' to ''sbyte[]''
sbyte[] sbytes = (sbyte[]) bytes;
E incluso cuando tienes un código que se compila con una advertencia, realmente no hace lo que dice:
byte[] bytes = new byte[10];
// warning CS0184: The given expression is never of the provided (''sbyte[]'')
if (bytes is sbyte[])
{
Console.WriteLine("Yes");
}
Ejecute ese código y no obtendrá resultados ... pero si simplemente cambia el tipo de bytes
tiempo de compilación, se imprime Sí:
object bytes = new byte[10];
// No warning now
if (bytes is sbyte[])
{
Console.WriteLine("Yes"); // This is reached
}
No estoy seguro de si se trata de un error de .NET, pero me parece muy interesante.
Como era de esperar, no puedo hacer esto:
sbyte[] sbytes = { 1, 2, 3 };
byte[] bytes = sbytes; // fails: cannot convert source type ''sbyte[]'' to taget type ''byte[]''
Sin embargo, si el tipo de sbytes
es un object
, esto funciona:
object obj = new sbyte[]{ 1, 2, 3 };
byte[] bytes = obj as byte[];
Assert.IsNull(bytes, "WTF??")
Observación 1 : El mismo problema ocurre para int[]
- uint[]
y los otros tipos primitivos también.
Observación 2 : aunque el código maneja la matriz como un byte[]
, el depurador pierde el foco y muestra ?
-s en la matriz.
Observación 3 : esto funciona solo para matrices, no para los tipos subyacentes en sí mismos:
object sbyteObj = (sbyte)1;
byte byteObj = (byte)sbyteObj; // System.InvalidCastException: Specified cast is not valid.
Ok, por supuesto que puedo comprobar el tipo como este:
if (obj.GetType() == typeof(byte[]))
¿Es este un comportamiento previsto del operador as
y el lanzamiento directo, o es un error de .NET?