C# 7.3 处理通用枚举约束的可能错误
Possible bug in C# 7.3 handling of generic Enum constraints
以下代码无法在 C# 7.3 中编译,即使它确实支持约束为枚举的泛型:
using System;
public class Test<T> where T: Enum
{
public void Method()
{
if (!Enum.TryParse<T>("something", out var value))
throw new Exception("Oops");
}
}
我使用 Enum
约束的其他代码确实有效,所以我拥有所有内容的正确版本,它似乎无法调用另一个也被约束为 Enum
.
这是一个错误还是我误解了它应该如何工作。
你需要一个额外的约束:
public class Test<T> where T: struct, Enum
{
public void Method()
{
if (!Enum.TryParse<T>("something", out var value))
throw new Exception("Oops");
}
}
只要 where T : Enum
,您就可以调用 new Test<Enum>().Method();
——即传入 Enum
类型,而不是任何特定类型的枚举。添加 struct
意味着您必须传入特定类型的枚举。
更具体地说,Enum.TryParse<T>
具有约束 where T : struct
,因此您需要在方法中匹配此约束。
以下代码无法在 C# 7.3 中编译,即使它确实支持约束为枚举的泛型:
using System;
public class Test<T> where T: Enum
{
public void Method()
{
if (!Enum.TryParse<T>("something", out var value))
throw new Exception("Oops");
}
}
我使用 Enum
约束的其他代码确实有效,所以我拥有所有内容的正确版本,它似乎无法调用另一个也被约束为 Enum
.
这是一个错误还是我误解了它应该如何工作。
你需要一个额外的约束:
public class Test<T> where T: struct, Enum
{
public void Method()
{
if (!Enum.TryParse<T>("something", out var value))
throw new Exception("Oops");
}
}
只要 where T : Enum
,您就可以调用 new Test<Enum>().Method();
——即传入 Enum
类型,而不是任何特定类型的枚举。添加 struct
意味着您必须传入特定类型的枚举。
更具体地说,Enum.TryParse<T>
具有约束 where T : struct
,因此您需要在方法中匹配此约束。