我实际上是在尝试回答this question,但由于这种情况非常复杂并且不太可能很快得到好的回复,我将尝试自己完成实施。基本问题似乎是我所关注的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应该在功能上相同
答案 0 :(得分:9)
VB.NET继承了以前版本的Visual Basic中的Option Compare
语句。为了实现这一目的,VB.NET中的所有字符串比较表达式都转换为辅助函数,该函数可以找出所选择的选项比较值在写入语句的特定源代码文件中的位置。
Operators.CompareString(string,string,bool)方法就是帮助函数。最后一个参数名为“TextCompare”,如果Option Compare Text生效,VB.NET编译器会自动传递True,如果Option Compare Binary生效,则自动传递。
C#没有那样的东西。
答案 1 :(得分: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
(在Visual Basic中为“Nothing
”的自定义逻辑,如副本所示)处理,更重要的是模式切换参数{{1} },从有效的TextCompare
设置中获取其值。
也许在Option Compare
上明确使用方法,而不是比较运算符,可以帮助你。
关于'为什么',好吧,VB(经典)在文化上总是更“做明智”的语言,而不是“完全按照我告诉你的,没有更多,没有更少”的哲学。 C ++ / Win32世界。 VB.NET和C#更接近,但仍然存在这样的差异。