【问题标题】:Why does the behavior differ between VB.net and C#?为什么 VB.net 和 C# 的行为不同?
【发布时间】:2012-10-22 08:55:28
【问题描述】:

据我所知,以下两个示例在功能上是相同的。

C#

namespace ConsoleApplication4
{
 class Program
 {
  static void Main(string[] args)
  {
   var x = new Example(12);
   var y = new Example(34);
   var z = Example.Examples.One;
  }
 }
 class Example
 {
  public static class Examples
  {
   public static readonly Example Zero = new Example(0);
   public static readonly Example One = new Example(1);
  }
  public readonly Double Value;
  public Example(Double Value)
  {
   this.Value = Value;
  }
  public static Example Add(Example x, Example y)
  {
   return new Example(x.Value + y.Value);
  }
 }
}

VB.net

Option Strict On
Module Module1

    Sub Main()

    Dim x=New Example(12)
    Dim y = New Example(34)
    Dim z=  Example.Examples.One
    End Sub

End Module

Public Class Example

  Public  Class Examples
    Public Shared ReadOnly Zero As Example
    Public Shared ReadOnly One As Example
    Public Shared ReadOnly Two As Example
    Public Shared ReadOnly MinusOne As Example
    Shared Sub new()
      Zero=New Example(0)
      One= New Example(1)
      Two = New Example(2)
      MinusOne = New Example(-1)
    End Sub
  End Class
  Public ReadOnly Value As Double
  Public Sub New(Value As Double)
    Me.Value=Value
  End Sub
  Public Shared Function Add(x As Example,y As Example) As Example
    Return New Example(x.Value+y.Value)
  End Function
End Class

那么为什么我只能在点之后获得 C# 中的实例方法(见下文)

z = Example.Examples.One.

在 VB.net 中

Dim z = Example.Examples.One.

我也收到了Examples

发生了什么事?为什么会有差异?

【问题讨论】:

  • 这是关于运行时行为还是 Visual Studio Intellisense 的问题?
  • 我认为 Slaks 猜对了,但问题没有说明问题。它也太长了。
  • @Kal_Torak 也可能是,因为我不知道为什么。这就是我问的原因。
  • @Henk Holterman 太长了?我提供了两个不同语言的代码示例,因此用户可以复制我拥有的代码并查看我遇到的“问题”。 Stack Overflow 不能兼得。问题太短,问题太长,没有提供代码。 (以及为什么cmets不保留换行符,你可以在cmets上进入可写的版本,但是保存的时候就去掉了。)
  • @HenkHolterman 据我所知,Adam 或多或少遵循 SO 的 MVCE guidelines

标签: c# vb.net


【解决方案1】:

出于兼容性原因,VB.Net 允许您通过实例限定符访问 Shared (static) 方法。
不要这样做;很混乱。

【讨论】:

  • 是的,我知道这很令人困惑。谁能提供一个兼容性的例子,因为我记得在 vb6 中你不能定义类。
  • 在 VB6 中,您可以定义类 - 它们包含在 .cls 文件中。
  • 也是20岁。人们不断提到的这种神话般的兼容性是什么。提供指向我可以查看和研究的文档的链接。我想我现在连一台可以运行 vb6 IDE 的机器都没有。
  • +1。但这不是出于兼容性原因。 VB6 根本不允许在类上使用共享(静态)方法。 @Adam 这里是VB6 reference guide。 VB6 IDE 可以在 Win7 64 位上运行。 VB6 已经 15 岁了(1998 年发布)。
  • @MarkJ 感谢您提供资源链接。 VB 于 1991 年首次出现(因此 21 岁)。 SLaks 说这是为了兼容性。我正在尝试确定兼容性原因是什么。
猜你喜欢
  • 2010-12-29
  • 2017-08-14
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 2012-04-22
  • 2012-07-09
  • 1970-01-01
  • 2021-05-10
相关资源
最近更新 更多