gpt4 book ai didi

.net - Paramarrays 的通用 Concat 扩展方法不适用于 IEnumerable(of String)

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:35:06 28 4
gpt4 key购买 nike

受 Max()/Min() 中的 Javascript 变量参数和函数式语言中的列表理解的启发,我尝试使用通用扩展方法在 VB.NET 中获得相同的结果类型,给定 IEnumerable(of T) 作为结果类型。这适用于字符串除外。为什么?这些扩展方法可能被认为是一个坏主意。为什么这是一个坏主意的任何有力理由。

  Option Explicit On
Option Strict On

Imports System.Runtime.CompilerServices

Module Module1

Sub Main()
Dim xs As IEnumerable(Of Integer) = 1.Concat(2, 3, 4)
Dim ys As IEnumerable(Of Double) = 1.0.Concat(2.0, 3.0, 4.0)
Dim zs As IEnumerable(Of String) = Concat("1", "2", "3", "4") 'silly but works, I would use a stringbuilder
'Dim zs2 As IEnumerable(Of String) = "1".Concat("2", "3", "4") ' does not work why?
'Gives:
'String' cannot be converted to 'System.Collections.Generic.IEnumerable(Of String)'
'because() 'Char' is not derived from 'String', as required for the 'Out' generic parameter 'T' in 'Interface IEnumerable(Of Out T)'.
'C:\Users\kruse\Documents\Visual Studio 10\Projects\VarArgsExperiment\VarArgsExperiment\Module1.vb 12 45 VarArgsExperiment

Console.ReadLine()
End Sub



<Extension()> _
Function Concat(Of T)(ByVal xs As IEnumerable(Of T), ByVal ParamArray params As T()) As IEnumerable(Of T)
Dim ys As IEnumerable(Of T) = params.AsEnumerable()
Return xs.Concat(ys)
End Function

<Extension()> _
Function Concat(Of T)(ByVal x As T, ByVal ParamArray params As T()) As IEnumerable(Of T)
Dim xs As New List(Of T)
xs.Add(x)
Dim ys As IEnumerable(Of T) = params.AsEnumerable
Return xs.Concat(ys)
End Function
End Module

...为了简短起见,截取了模块的其余部分。 Als 为 Add、Cast 和 Apply for Action 对象编写了一些方法。

最佳答案

一个字符串是一个IEnumerable<char> ,并且字符串和字符之间没有关系。你可以把它想象成一个维度的问题,一个字符串通常可以被认为是一个char的数组。 char[] 不等于 char,永远也不会。 System.String 还实现了一个 Concat 方法,它可能会扰乱您的类型签名,因此您可能需要小心处理。

关于.net - Paramarrays 的通用 Concat 扩展方法不适用于 IEnumerable(of String),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1581938/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com