在VS2022+Framework4.5.2中,如何在内联函数创建带命名值的Tuple
问题:.NET Framework 4.5.2中创建带命名值的内联Tuple
我正在维护一个基于VS 2022和.NET Framework 4.5.2的解决方案,需要在内联函数中创建带命名值的Tuple并传递给其他函数。已掌握两种方式:一是创建无命名参数的内联Tuple并赋值,二是声明带命名值的内联Tuple但不赋值。现在想同时实现命名与赋值,以下代码可正常运行:
Dim q1 = myEnumerable.Select( Function(x) New Tuple(Of String, String, String)(x.Name, x.URL, x.Name) )
但以下代码出现报错(值下方有红色波浪线),请问该如何实现?
Dim q2 = myEnumerable.Select( Function(x) New Tuple(Of (name As String, link As String, tooltip As String))(x.Name, x.URL, x.Name) )
解决方案
你写的报错代码里的语法是ValueTuple的特性,而.NET Framework 4.5.2并不支持这种语法——传统的Tuple<T1,T2,T3>是引用类型,没有命名字段的定义方式,带命名的ValueTuple是在.NET Framework 4.7及以上版本才原生支持的(也可以通过安装System.ValueTuple NuGet包向下兼容,但需要项目能引入NuGet包)。
针对你的场景,有两种可行的实现方式:
方式一:自定义类/结构体(适配.NET Framework 4.5.2)
如果无法升级框架或引入NuGet包,可以自定义一个带命名属性的类来替代Tuple:
Public Class NamedTuple Public Property Name As String Public Property Link As String Public Property Tooltip As String Public Sub New(name As String, link As String, tooltip As String) Me.Name = name Me.Link = link Me.Tooltip = tooltip End Sub End Class
然后在内联函数中使用:
Dim q2 = myEnumerable.Select( Function(x) New NamedTuple(x.Name, x.URL, x.Name) )
方式二:使用ValueTuple(需升级框架或引入NuGet包)
如果可以将项目的.NET Framework版本升级到4.7及以上,或者安装System.ValueTuple NuGet包,就可以直接使用带命名的ValueTuple语法,不需要显式创建Tuple对象:
Dim q2 = myEnumerable.Select( Function(x) (name:=x.Name, link:=x.URL, tooltip:=x.Name) )
这种方式创建的是值类型的ValueTuple,自带命名字段,符合你的需求。
内容的提问来源于stack exchange,提问作者CompanyDroneFromSector7G
相关产品推荐
相关产品推荐

