将接口实现从VB.NET转换为C#

时间:2010-09-11 20:19:01

标签: c# .net vb.net interface

这似乎是一个明显的答案,但我似乎无法找到答案。我在VB.NET中有这个代码:

Public Interface ITestInterface
    WriteOnly Property Encryption() As Boolean
End Interface

我在VB.NET中也有这个类和实现:

Partial Public Class TestClass
    Implements ITestInterface

    Public WriteOnly Property EncryptionVB() As Boolean Implements ITestInterface.Encryption
        Set(ByVal value As Booleam)
             m_Encryption = value
        End Set
    End Property
End Class

我正在尝试将其转换为C#。我把C#接口转换得很好,就像这样:

public interface ITestInterface
{
    bool Encryption { set; }
}

问题是,如何将实现转换过来。我有这个:

public partial class TestClass
{
    public bool Encryption 
    {
         set { m_Encryption = value; }
    }
}

问题在于,在C#中,您似乎必须将该函数命名为与您正在实现的接口函数相同的名称。如何调用此方法EncryptionVB而不是Encryption,但仍然实现加密属性?

5 个答案:

答案 0 :(得分:5)

我能想到的最接近的方式是使用显式实现:

public partial class TestClass : ITestInterface
{
    public bool EncryptionVB
    {
         ((ITestInterface)this).Encryption = value;
    }

    bool ITestInterface.Encryption { set; }
}

现在,从表面上看,这似乎“不一样”。但确实如此。考虑一下这样的事实:在VB.NET中,当您为实现接口成员的成员命名的内容与接口定义的内容不同时,只有在编译时知道类型时才会出现此“新名称”。

所以:

Dim x As New TestClass
x.EncryptionVB = True

但如果上述代码中的x输入为ITestInterface,则EncryptionVB属性将不可见。它只能作为Encryption

访问
Dim y As ITestInterface = New TestClass
y.Encryption = True

事实上,这与C#中的显式接口实现的行为完全相同。看看等效的代码:

TestClass x = new TestClass();
x.EncryptionVB = true;

ITestInterface y = new TestClass();
y.Encryption = true;

答案 1 :(得分:4)

C#不像VB.NET那样支持接口成员别名。

最佳匹配将是这样的:

public partial class TestClass : ITestInterface{
  bool ITestInterface.Encryption {
    set { m_Encryption = value; }
  }

  public bool EncryptionVB {
    set { ((ITestInterface)this).Encryption = value; }
  }
}

答案 2 :(得分:2)

使用保护级别执行更改

public bool EncryptionVB {
    set { m_Encryption = value; }
}
bool ITestInterface.Encryption {
    set { EncryptionVB = value; }
}

答案 3 :(得分:0)

这在C#中是不可能的 - 在实现界面时,成员必须在界面中定义名称。

答案 4 :(得分:0)

VB.NET具有很多功能,很少有人完全不遵循OOPS。其中之一就是这个。 C#不允许使用其他名称实现接口。我不知道为什么它支持VB.NET,可能是因为向后兼容。