Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 可以用';重写LINQ以避免丢失MemberException;选项推断关闭';?_.net_Vb.net_Linq_Option Infer - Fatal编程技术网

.net 可以用';重写LINQ以避免丢失MemberException;选项推断关闭';?

.net 可以用';重写LINQ以避免丢失MemberException;选项推断关闭';?,.net,vb.net,linq,option-infer,.net,Vb.net,Linq,Option Infer,这是一个简单的将字符串编码成在正则表达式中可以接受的文本的编码器。在启用选项推断时运行良好,但在禁用选项推断时崩溃,产生 MissingMemberException:找不到类型VB$AnonymousDelegate_1(字符、字符串)的默认成员。 是否可以重写LINQ表达式,使其即使使用选项推断关闭?我想将其关闭,因为我认为在大型遗留项目/库中打开选项推断存在风险。(还是我错了?) 这是方法的代码: Shared Function EscapeLiteralForRegexPattern(i

这是一个简单的将字符串编码成在正则表达式中可以接受的文本的编码器。在启用
选项推断时运行良好,但在禁用
选项推断时崩溃,产生
MissingMemberException:找不到类型VB$AnonymousDelegate_1(字符、字符串)的默认成员。

是否可以重写LINQ表达式,使其即使使用
选项推断关闭
?我想将其关闭,因为我认为在大型遗留项目/库中打开
选项推断存在风险。(还是我错了?)

这是方法的代码:

Shared Function EscapeLiteralForRegexPattern(inputString As String) As String

  '*** Based on Escape(). Keep them in sync.
  Const dontEscapeFrom = &H20
  Const dontEscapeTo = &H7E
  If String.IsNullOrEmpty(inputString) Then Return inputString

  Const escaper As String = "\"
  Const escapePattern As String = escaper & escaper
  Const tabPattern As String = escaper & "t"
  Const crPattern As String = escaper & "r"
  Const lfPattern As String = escaper & "n"
  Const unicodePattern As String = escaper & "u{0:X4}"
  Const asciiPattern As String = escaper & "x{0:X2}"

  Dim ConvertChar = Function(c As Char) As String
             If c = escaper Then Return escapePattern
             Dim ac As Integer = AscW(c)
             If ac >= dontEscapeFrom AndAlso ac <= dontEscapeTo Then
               Return Regex.Escape(c)
             End If
             Dim result As String = String.Format(If(ac < &H80, asciiPattern, unicodePattern), ac)
             If dontEscapeFrom = 0 Then Return result
             Select Case c
               Case vbTab
                 Return tabPattern
               Case vbCr
                 Return crPattern
               Case vbLf
                 Return lfPattern
               Case Else
                 Return result
             End Select
           End Function

  Return String.Join(String.Empty, inputString.Select(Function(c) ConvertChar(c)).ToArray())

End Function

功劳归于——见他的评论

我将代码添加到旧式笨重的库中,该库需要有
选项显式关闭
选项严格关闭
,直到重写


我忘记了它们是关闭的,因此在编码过程中错过了一些显式类型声明。在
上显示的
选项和
上严格的
选项以及所有请求的更正之后,
MissingMemberException
的整个问题消失了。

投票人:你能留下反馈吗?问题出了什么问题?你的代码中有一个错误,你正在比较苹果和桔子。通过在源代码文件顶部添加选项Strict,可以发现这一点。启用“推断”选项后,编译器可以将苹果变成橘子。如果你关掉它,不,你会得到苹果酱。不是我,但你想复制吗?@AndrewMorton-
RegEx.Escape
是这个方法的一部分,正如你所看到的,它只做最小的替换(doc说:转义一组最小的字符(见列表)…),但我需要有人类可读的\r\n\t,那
RegEx.Escape
对我没用。也不说非Ascii字符。@HansPassant-太好了!谢谢你的提示,汉斯!我提醒自己,我应该在那个旧的大库之外测试新方法,因为这会迫使我进入
严格关闭
显式关闭
(我讨厌两者)。有时我在编码时忘记了它们是关闭的,就像在这个例子中一样。Hans没有提到的一点是,您可以在每个文件的基础上设置Option Strict和Option推断。任何时候,当您处理的遗留项目在每个项目的基础上关闭这些选项时,都应该在每个文件的基础上添加它们,然后在有机会清理文件时设置为打开。
  Return String.Join(String.Empty, inputString.Select(Function(c As Char) As String
                              Return ConvertChar(c)
                            End Function).ToArray())