gpt4 book ai didi

C# Switch 表达式返回不同的结果

转载 作者:行者123 更新时间:2023-12-04 00:53:54 24 4
gpt4 key购买 nike

我已经在我的一个项目中切换到 C# 8。而且我一直在移动我所有的switch语句到表达式。然而,我发现我的项目开始以不同的方式工作,我发现这是因为 switch表达。例如,让我们获取此代码

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

我已经将结果写为注释,但是当使用经典 switch 时,tl;dr 将值返回预期类型中的值,但是当使用 switch 表达式时,它返回“Double”类型,导致不同的 byte[]获取值的字节时。

两者有什么区别?我想念什么?

最佳答案

在您的 switch 语句形式中,每个分支都直接返回一个值。它从数字类型直接转换为 object ,因为这实际上是方法的返回类型。

您的 switch 表达式形式略有不同。它首先从 switch 表达式中提取结果,然后将该结果转换为声明的返回类型。那么switch表达式的类型是什么?它是 switch 表达式分支中所有单个表达式类型中的“最佳”类型。

所有这些类型都可以隐式转换为 double (这是类型本身之一),所以这是最好的类型。所以你的 switch 表达式方法相当于:

public static dynamic CastToTypeExpression(dynamic value, DataType type)
{
double result = 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(),
};
return result;
}

您可以在不使用 switch 表达式的情况下使用隐式类型数组查看这个“最佳类型”:
var array = new[]
{
(byte) 0, 0.0, (short) 0, 0,
0L, 0f, (ushort) 0, 0U, 0UL
};

这里的类型 array推断为 double[] .

关于C# Switch 表达式返回不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58743672/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com