'Microsoft.Win32.Registry'是'type',但用作'变量'

时间:2012-06-19 17:27:22

标签: c# vb.net c#-4.0

我正在尝试将一些VB.net代码转换为C#,并且在尝试转换这一行时遇到问题。

VB.NET

Dim myreg As Microsoft.Win32.Registry

我知道它是静态的所以我无法创建实例但是当我尝试使用VB.NET转换器到C#时,网站给了我这个:

Microsoft.Win32.Registry myreg = null;

并给我一个错误消息:'Microsoft.Win32.Registry'是'类型'但是像'变量'一样使用

在VB.NET中的函数的最后一部分中,使用了myreg:

Finally
  myreg = Nothing
End Try

这是整个功能:

Imports System.Data.OleDb
Imports System.Data
Imports Microsoft.Win32.RegistryKey
Imports MyLogger 'custom reference, not worried about this.

Private Function getRegistryString(ByVal sVal As String, Optional ByVal sKey As String = "") As String
    Dim myreg As Microsoft.Win32.Registry
    Dim s As String
    Try
        s = myreg.LocalMachine.OpenSubKey(sKey).GetValue(sVal)
    Catch ex As Exception
        l.EventLog(ex.Message, EventLogEntryType.Error)
        Throw ex
    Finally
        myreg = Nothing
    End Try
    Return s
    s = Nothing
End Function

2 个答案:

答案 0 :(得分:4)

Microsoft.Win32.Registry是一个静态类,因此您无法实例化它。

http://msdn.microsoft.com/library/microsoft.win32.registry.aspx

编辑:应该是评论而不是答案。我还是这个网站的新手抱歉。

答案 1 :(得分:4)

在VB.NET中,无法定义共享(静态)类。但是,在C#中,您可以指定类是静态的。当一个类是静态的时,它也强制所有成员都是静态的。如果尝试声明静态类型的变量,编译器将给出错误。

然而,在VB中,由于没有共享类这样的东西,它总是允许你声明任何类型的变量,即使它完全没有意义,因为实例没有成员。

您需要将代码更改为仅使用Registry类名本身,而不是将变量声明为类型Registry。将变量设置为Nothing是没有意义的,因为变量从不存储对对象的引用。它总是Nothing

您的功能应如下所示:

Private Function getRegistryString(ByVal sVal As String, Optional ByVal sKey As String = "") As String
    Dim s As String
    Try
        s = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(sKey).GetValue(sVal)
    Catch ex As Exception
        l.EventLog(ex.Message, EventLogEntryType.Error)
        Throw ex
    End Try
    Return s
End Function