在每个重载版本中GetValues返回的类型是什么?


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页面供快速参考。

我的问题:

  1. 以上理解对吗?
  2. 如果不是,有人可以给出一个例子,我们正在使用重载版本的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的结构,但是非泛型方法也允许他们指定一个类。

相关内容

  • 没有找到相关文章

最新更新