【问题标题】:C# equivalent of { }.Contains() in VBVB 中 { }.Contains() 的 C# 等价物
【发布时间】:2017-12-20 07:36:31
【问题描述】:

我正在开发一个 VB => C# 转换器,并且我遇到了一些我不确定是否可以直接转换为 C# 的 VB 代码。

在 VB 中你可以做类似的事情

If {"a", "b", "c"}.Contains("c") Then ...

(让我们假装它有用但并不总是正确的)

我想知道在 C# 中是否有这样的等价物。我能想到的最接近的事情是

if (new object[] {"a", "b", "c"}.Contains("c")) { ... }

我的问题是我必须在 C# 中定义类型,这意味着我必须使用对象 - 因为我正在编写一个翻译器,它需要同样适用于 int 的数组、bool 的数组、自定义类的数组等。我不确定让所有东西都成为对象而不是更具体的类型是个好主意。

有没有办法让编译器找出类型?逻辑上是这样的:(我知道这不行,但逻辑上等价于......)

if (new var[] {"a", "b", "c"}.Contains("c")) { ... }

所以它将数组视为字符串数组,并将 Contains 参数视为字符串?

附带问题:我的印象是上面的 VB 代码将{"a", "b", "c"} 视为string 的数组。它是否正确?上面的 VB 代码是否将“a”、“b”和“c”视为对象 - 如果是这样,我也会在 C# 中使用对象。

【问题讨论】:

  • 使用 ToString() 将对象转换为字符串。
  • new [] { ...}

标签: c# arrays vb.net


【解决方案1】:

如果所有数组元素都是相同类型,或者它们是不同类型但满足类型推断的方式,则可以使用 隐式类型数组 - 例如 var 但对于数组,基本上:

if (new[] { "a", "b", "b" }.Contains("c"))

我不知道这在语义上是否与 VB 代码相同。

【讨论】:

  • 一些技术细节。 C# 编译器将查看三个条目的编译时类型,并确定string 是最佳匹配类型。所以它会生成一个new string[3](而不是问题中的object[])。然后因为T[]IEnumerable<T>,所以将使用扩展IEnumerable<> 的LINQ 中的Contains 方法。这将使用执行序数值比较的EqualityComparer<string>.Default 实例。也就是说,如果两个字符串作为char值的“向量”相等,则两个字符串相等,对大小写敏感,不考虑文化。
【解决方案2】:

关于附带问题:

fragment from 'Arrays in Visual Basic' on Microsoft Docs

Dim numbers = New Integer() {1, 2, 4, 8}
Dim doubles = {1.5, 2, 9.9, 18}

当你使用类型推断时,数组的类型是确定的 由为 数组字面量。主导类型是一种独特的类型,所有其他类型 数组文字中的类型可以扩大。如果这种独特的类型不能 确定,主导类型是所有其他类型的唯一类型 数组中的类型可以缩小。如果这些独特的类型都不能 确定,主要类型是Object。例如,如果列表 提供给数组字面量的值包含类型的值 IntegerLongDouble,结果数组的类型为 Double。两个都 IntegerLong 仅扩大到 Double。因此,Double 是 主导型。如需更多信息,请参阅Widening and Narrowing Conversions

【讨论】:

    猜你喜欢
    • 2011-03-09
    • 2015-11-02
    • 1970-01-01
    • 2011-03-18
    • 2019-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    相关资源
    最近更新 更多