Module Module1
Enum Colors
Red
Green
Blue
Yellow
End Enum
Sub main()
Dim values = [Enum].GetValues(GetType(Colors)) ' Statement 1
Console.WriteLine(values.GetType) 'O/P: Colors[]
Console.ReadLine()
End Sub
End Module
Values
预期为Colors[]
类型。现在我的问题是这里执行的是GetValues的哪个重载版本?为了把它放在上下文中,基本的GetValues方法返回Array
类型,而重载版本返回TEnum[]
类型。由于Values
不是Array
类型,而是特定的枚举数组类型(在本例中为Colors[]
),因此我推断语句1正在调用GetValues方法的重载版本。
添加MSDN GetValues页面供快速参考。
我的问题:
- 以上理解对吗?
- 如果不是,有人可以给出一个例子,我们正在使用重载版本的GetValues方法,返回
TEnum[]
类型?
此外,正如我从@John发布的答案中所理解的那样,返回Array
类型的GetValues方法是前泛型,并且没有在语句GetValues(GetType(Colors))
中被调用。这种理解正确吗?
EDIT:
我刚刚意识到泛型重载只是在。net 5中引入的,所以任何更早的版本都只能使用非泛型版本。这意味着。net Core 3.1或更早版本以及。net框架的任何版本。阅读文档并确认类型或方法适用于哪些。net版本总是一个好主意。
原始:
都可以,但是第一个是在泛型不存在的时候创建的。泛型方法通常比非泛型方法更好。你可以这样做:
Dim values = [Enum].GetValues(GetType(Colors))
或:
Dim values = [Enum].GetValues(Of Colors)()
,第二个变量的类型是Colors()
,这正是您想要的。
至于As Structure
的通用约束,它在那里是因为这是最接近于将TEnum
约束为实际的Enum
的。你不能把它约束到那么远,但至少你可以把它约束成一个结构体,这样就没人能在调用那个方法时指定一个类。因为Enums
是底层结构,因为它们都是数字类型——默认是Integer
——底层结构。当调用该方法时,有人仍然可以指定一个不是Enum
的结构,但是非泛型方法也允许他们指定一个类。