4

我实际上是在尝试回答这个问题,但由于这涉及到很多问题,而且不太可能很快得到很好的回应,所以我将尝试自己制定实施方案。根本问题似乎是我遵循的 C# 示例没有直接转换为 VB。

在 lambda 中检查字符串比较BinaryExpression时,VB 报告Expression.Method.DeclaringType方法Microsoft.VisualBasic.CompilerServices.Operators名称为CompareString. 这显然是 VB 特有的。

表达式只是x.Content_Type <> ""在返回时比较并调用 ToString {(CompareString(x.Content_Type, "", False) != 0)}- 这看起来很合乎逻辑(CompareString docs here)。

有人可以向我解释 VB 和 C# 如何(甚至更好地解释为什么)以不同的方式处理字符串比较。

我想如果我能得到答案,我应该能够找到另一个问题的解决方案。

编辑: 为了澄清,我正在实现一个自定义 LINQ 提供程序,它正在检查以下Where调用:

Query.Where(function(x) x.Content_Type <> "")

或 C# 等价物...

query.Where(x=>x.Content_Type!="");

据我所知,2应该在功能上相同

4

2 回答 2

10

Option CompareVB.NET从以前版本的 Visual Basic继承了该语句。为此,VB.NET 中的所有字符串比较表达式都被转换为一个帮助函数,该函数可以找出在编写语句的特定源代码文件中选择的选项比较值是什么。

Operators.CompareString(string, string, bool) 方法就是那个辅助函数。最后一个参数名为“TextCompare”,如果 Option Compare Text 有效,VB.NET 编译器自动传递 True,如果 Option Compare Binary 有效,则自动传递 False。

C# 没有这样的东西。

于 2012-08-30T13:28:34.663 回答
5

反编译CompareString给出

public static int CompareString(string Left, string Right, bool TextCompare)
{
  if (Left == Right)
    return 0;
  if (Left == null)
    return Right.Length == 0 ? 0 : -1;
  else if (Right == null)
  {
    return Left.Length == 0 ? 0 : 1;
  }
  else
  {
    int num = !TextCompare 
       ? string.CompareOrdinal(Left, Right) 
       : Utils.GetCultureInfo().CompareInfo
              .Compare(Left, Right, CompareOptions.IgnoreCase 
                                  | CompareOptions.IgnoreKanaType 
                                  | CompareOptions.IgnoreWidth);
    if (num == 0)
      return 0;
    return num > 0 ? 1 : -1;
  }
}

从中可以看出,围绕null(“Nothing在Visual Basic中”,正如副歌所说)处理有自定义逻辑,更重要的是,模式切换参数,它从有效的设置中TextCompare获取其值。Option Compare

也许显式使用on方法string而不是比较运算符帮助您。

至于“为什么”,嗯,VB(经典)在文化上始终是一种更“做明智之事”的语言,而不是 C++ / Win32 的“完全按照我告诉你的,仅此而已”的哲学世界。VB.NET 和 C# 更接近,但仍然存在这样的差异。

于 2012-08-30T13:32:16.577 回答