可能 System.InvalidCastException 将 Enum 转换为 int?
Possible System.InvalidCastException casting Enum to int?
我有以下代码片段:
internal static class Program
{
private enum MyEnum
{
MyVal = 2,
}
private enum AlsoMyEnum
{
AlsoMyVal = 2,
}
private static class Thing
{
public static object DoThing(object objectIn) =>
objectIn is Enum ? (int)objectIn : objectIn;
}
[STAThread]
private static void Main(string[] args)
{
var objectOut = Thing.DoThing(MyEnum.MyVal);
var objectOut2 = Thing.DoThing(AlsoMyEnum.AlsoMyVal);
var @false = MyEnum.MyVal.GetType() == AlsoMyEnum.AlsoMyVal.GetType();
var @true = objectOut.GetType() == objectOut2.GetType();
}
}
ReSharper 抱怨“(int)objectIn”是 "Possible 'System.InvalidCastException'"。
根据我的理解,这段代码很好(因此,我应该取消警告)- 如果某物是 Enum,那么将其转换为 int 应该是有效的。但是,我想检查一下 - 我是否遗漏了什么?
警告是否正确?或者是否有其他方法可以避免警告,同时仍然将 int 放入 parameter.Value?
编辑
感谢@InBetween 指出警告实际上是正确的。为了修复代码,应该改用:
public static object DoThing(object objectIn) => objectIn is Enum
? Convert.ChangeType(objectIn, Enum.GetUnderlyingType(objectIn.GetType()))
: objectIn;
盒装枚举只能转换为其基础类型。这将失败:
enum LongEnum: long
{
Woops
}
object o = LongEnum.Woops;
var i = (int)o;
这是由于一条更通用的规则:任何装箱的值类型只能拆箱为其类型:
object o = 1; //boxed int
var s = (short)o; //fails
您可以尝试下面给出的答案中提到的代码
C# Iterating through an enum? (Indexing a System.Array)
这里的主要目的是要知道每个枚举值都有两部分 - 名称和值。值可以转换为整数。
Enum.GetValues return 该枚举中所有值的数组。如果你只想要这个,那么只需要第一行代码。
public enum MyEnum
{
First,
Second,
Third
}
private void EnumValues()
{
Array values = Enum.GetValues(typeof(MyEnum));
foreach (MyEnum val in values)
{
//// To print name and value in enum
Console.WriteLine(String.Format("{0}: {1}", Enum.GetName(typeof(MyEnum), val), val));
//// To get only value
int i = (int)val;
}
}
希望对您有所帮助。
假设您使用的是 C#7,您可以将模式匹配的结果分配给一个变量。
如果您有这样的枚举:
public enum TestEnum
{
A = 1,
B = 2,
C = 3
}
然后你可以使用
来处理它
if (param.Value is TestEnum enumValue)
{
parameter.Value = (int)enumValue;
}
你不能将 System.Enum
转换为 int
,所以如果你的示例反映了你的实际代码,它实际上不会编译。
我有以下代码片段:
internal static class Program
{
private enum MyEnum
{
MyVal = 2,
}
private enum AlsoMyEnum
{
AlsoMyVal = 2,
}
private static class Thing
{
public static object DoThing(object objectIn) =>
objectIn is Enum ? (int)objectIn : objectIn;
}
[STAThread]
private static void Main(string[] args)
{
var objectOut = Thing.DoThing(MyEnum.MyVal);
var objectOut2 = Thing.DoThing(AlsoMyEnum.AlsoMyVal);
var @false = MyEnum.MyVal.GetType() == AlsoMyEnum.AlsoMyVal.GetType();
var @true = objectOut.GetType() == objectOut2.GetType();
}
}
ReSharper 抱怨“(int)objectIn”是 "Possible 'System.InvalidCastException'"。
根据我的理解,这段代码很好(因此,我应该取消警告)- 如果某物是 Enum,那么将其转换为 int 应该是有效的。但是,我想检查一下 - 我是否遗漏了什么?
警告是否正确?或者是否有其他方法可以避免警告,同时仍然将 int 放入 parameter.Value?
编辑
感谢@InBetween 指出警告实际上是正确的。为了修复代码,应该改用:
public static object DoThing(object objectIn) => objectIn is Enum
? Convert.ChangeType(objectIn, Enum.GetUnderlyingType(objectIn.GetType()))
: objectIn;
盒装枚举只能转换为其基础类型。这将失败:
enum LongEnum: long
{
Woops
}
object o = LongEnum.Woops;
var i = (int)o;
这是由于一条更通用的规则:任何装箱的值类型只能拆箱为其类型:
object o = 1; //boxed int
var s = (short)o; //fails
您可以尝试下面给出的答案中提到的代码 C# Iterating through an enum? (Indexing a System.Array)
这里的主要目的是要知道每个枚举值都有两部分 - 名称和值。值可以转换为整数。
Enum.GetValues return 该枚举中所有值的数组。如果你只想要这个,那么只需要第一行代码。
public enum MyEnum
{
First,
Second,
Third
}
private void EnumValues()
{
Array values = Enum.GetValues(typeof(MyEnum));
foreach (MyEnum val in values)
{
//// To print name and value in enum
Console.WriteLine(String.Format("{0}: {1}", Enum.GetName(typeof(MyEnum), val), val));
//// To get only value
int i = (int)val;
}
}
希望对您有所帮助。
假设您使用的是 C#7,您可以将模式匹配的结果分配给一个变量。
如果您有这样的枚举:
public enum TestEnum
{
A = 1,
B = 2,
C = 3
}
然后你可以使用
来处理它if (param.Value is TestEnum enumValue)
{
parameter.Value = (int)enumValue;
}
你不能将 System.Enum
转换为 int
,所以如果你的示例反映了你的实际代码,它实际上不会编译。