Tôi đã chuyển sang C # 8 trong một trong những dự án của mình. Và tôi đã chuyển tất cả các switchphát biểu của mình sang các biểu thức. Tuy nhiên tôi phát hiện ra rằng dự án của tôi bắt đầu hoạt động khác đi và tôi đã phát hiện ra rằng đó là do switchbiểu hiện. Hãy lấy mã này làm ví dụ
class Program
{
public enum DataType
{
Single,
Double,
UInt16,
UInt32,
UInt64,
Int16,
Int32,
Int64,
Byte
}
static void Main(string[] args)
{
dynamic value1 = 5;
dynamic value2 = 6;
var casted = CastToType(value1, DataType.Int16);
var casted1 = CastToTypeExpression(value2, DataType.Int16);
var type = casted.GetType(); // Int16
var type1 = casted1.GetType(); // Double
var bytes = BitConverter.GetBytes(casted); // byte arr with 2 el => [5, 0] <- expected behavior
var bytes1 = BitConverter.GetBytes(casted1); // byte arr with 8 el => [0, 0, 0, 0, 0, 0, 24, 64]
}
public static dynamic CastToType(dynamic value, DataType type)
{
switch (type)
{
case DataType.Byte:
return (byte)value;
case DataType.Double:
return (double)value;
case DataType.Int16:
return (short)value;
case DataType.Int32:
return (int)value;
case DataType.Int64:
return (long)value;
case DataType.Single:
return (float)value;
case DataType.UInt16:
return (ushort)value;
case DataType.UInt32:
return (uint)value;
case DataType.UInt64:
return (ulong)value;
default: throw new InvalidCastException();
}
}
public static dynamic CastToTypeExpression(dynamic value, DataType type)
{
return type switch
{
DataType.Byte => (byte)value,
DataType.Double => (double)value,
DataType.Int16 => (short)value,
DataType.Int32 => (int)value,
DataType.Int64 => (long)value,
DataType.Single => (float)value,
DataType.UInt16 => (ushort)value,
DataType.UInt32 => (uint)value,
DataType.UInt64 => (ulong)value,
_ => throw new InvalidCastException(),
};
}
}
Tôi đã viết kết quả dưới dạng một nhận xét, nhưng tl; dr khi sử dụng công tắc cổ điển, truyền giá trị trả về giá trị trong Loại dự kiến, nhưng khi sử dụng biểu thức chuyển đổi, nó trả về loại "Double", dẫn đến khác nhau byte[]khi nhận được byte của giá trị.
Sự khác biệt giữa hai là gì? Tôi nhớ cái gì