在属性定义中实现

时间:2014-03-05 15:36:50

标签: c# vb.net

所以我试图将一些VB代码转换为C#。属性定义如下:

Public Overridable ReadOnly Property [Error]() As String Implements System.ComponentModel.IDataErrorInfo.Error

我见过的转换看起来像这样:

public virtual string Error

现在我理解这里的一切,除了它忽略了Implements行。这在C#中是不是必要吗?

3 个答案:

答案 0 :(得分:5)

  

这在C#中是不是必要吗?

否 - 默认情况下,C#将隐式实现接口。 通常您可以显式实现接口方法:

string System.ComponentModel.IDataErrorInfo.Error

但是在你的情况下,属性是virtual,所以你不能使用显式实现(显式实现必须是private,这对virtual成员没有意义。

隐式和显式实现的主要区别在于,使用者需要具有接口类型的引用,或者将类强制转换为接口:

MyDataErrorInfo impl = new MyDataErrorInfo();
string s;
IDataErrorInfo i = new MyDataErrorInfo();   // implicitly cast 

s = i.Error;  // works
s = ((IDataErrorInfo)impl).Error;  // works
s = impl.Error;   // does not work

答案 1 :(得分:1)

C#中接口的属性实现不需要提及接口:

public virtual string Error { get; set; }

如果您想要一个显式的接口实现:

string IDataErrorInfo.Error { get; set; }

答案 2 :(得分:1)

如果要将属性保持为只读,则需要使用非自动属性(VB也禁止实现readonly属性的自动属性):

隐式实施:

public string Error
{
    get
    {
        //...
    }
}

明确的实施:

string System.ComponentModel.IDataErrorInfo.Error
{
    get
    {
        //...
    }
}