所以我试图将一些VB代码转换为C#。属性定义如下:
Public Overridable ReadOnly Property [Error]() As String Implements System.ComponentModel.IDataErrorInfo.Error
我见过的转换看起来像这样:
public virtual string Error
现在我理解这里的一切,除了它忽略了Implements行。这在C#中是不是必要吗?
答案 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
{
//...
}
}