为什么可以';当在C#.NET中有效时,是否在VB.NET中重写t接口只读属性?
(这与) 如果定义了一个接口,其中有一个属性只有一个getter(=VB.NET中的ReadOnly),那么为什么可以在用C#实现类时定义setter,而不能用VB来定义 我本以为它是在.NET级别定义的,而不是特定于语言的 示例:对于此接口为什么可以';当在C#.NET中有效时,是否在VB.NET中重写t接口只读属性?,.net,c#-to-vb.net,vb.net-to-c#,.net,C# To Vb.net,Vb.net To C#,(这与) 如果定义了一个接口,其中有一个属性只有一个getter(=VB.NET中的ReadOnly),那么为什么可以在用C#实现类时定义setter,而不能用VB来定义 我本以为它是在.NET级别定义的,而不是特定于语言的 示例:对于此接口 'VB.NET Interface SomeInterface 'the interface only say that implementers must provide a value for reading ReadOnly Pro
'VB.NET
Interface SomeInterface
'the interface only say that implementers must provide a value for reading
ReadOnly Property PublicProperty As String
End Interface
或
这是C#中的正确实现:
但是这在VB.NET中是无效的
Public Property PublicProperty As String Implements SomeInterface.PublicProperty
Get
Return _myProperty
End Get
Set(ByVal value As String)
_myProperty = value
End Set
End Property
更新日期2015/04/23 原来这个功能是VB14的一部分! 见和: 只读接口属性可以通过ReadWrite道具实现 这清理了语言中一个奇怪的角落。看看这个例子:
Interface I
ReadOnly Property P As Integer
End Interface
Class C : Implements I
Public Property P As Integer Implements I.P
End Class
以前,如果您正在实现只读属性I.p,那么
您还必须使用只读属性来实现它。既然
限制已经放宽:您可以通过读/写来实现它
财产,如果你想的话。这个例子恰好用一个
读/写autoprop,但也可以使用getter和
塞特
如果VB.NET和C#是用不同口音说的同一种语言,那么要小心——它们不是 因为VB.NET要求接口成员的实现具有
Implements
子句,说明它正在实现哪个成员。C#允许显式实现接口成员(有点像VB.NET),或隐式实现接口成员(没有VB.NET等价物)。因此,实际的C#版本是
public class Implementer : IPublicProperty
{
private string _publicProperty;
string IPublicProperty.PublicProperty // explicit implementation
{
get
{
return _publicProperty;
}
set
{
_publicProperty = value;
}
}
}
这确实给出了一个错误:
错误CS0550:'ConsoleApplication171.Implementer.ConsoleApplication171.IPublicProperty.PublicProperty.set'添加在接口成员'ConsoleApplication171.IPublicProperty.PublicProperty'中找不到的访问器'
在.net中,接口中只读属性的实现必须包括一个getter而不是setter,读写属性的实现必须同时包括getter和setter。对于只写属性的实现(如果有人定义了这样的东西),也必须包含setter而不包含getter 在C#中,如果一个类定义了一个与接口中的属性同名的公共属性,该公共属性实现该接口所需的方法,而该类没有显式实现接口属性,编译器将自动生成一个使用公共属性的getter和/或setter的属性,视情况而定。即使一个类实现了三个接口,一个具有只读属性
Foo
,一个具有只读属性Foo
,一个具有读写属性Foo
,也可以使用单个公共读写属性Foo
为所有接口实现Foo
属性
从概念上讲,vb.net没有理由不能提供类似的功能,并根据实现接口的需要生成两个(甚至三个)不同的属性。至少在目前,如果一个vb.net类成员被标记为实现接口成员,那么期望的是它将在不包装的情况下与该成员完美匹配。真正让我感到困扰的是,最终,属性只是一个访问器,而据我所知,编译器最终会生成类似MSIL的某种访问器方法“myProp_Set”、“my_Prop_Get”,因此定义一个setter只会导致在实现器中“添加一个额外的方法”,这不是我所说的破坏接口……但我在这里所说的可能是完全错误的……我对从“高层次”开始的过程知之甚少“语言到MSIL…@tsi我认为你对VB的看法是正确的-我对C#显式接口实现的IL细节不太清楚。从语言设计的角度来看,通常VB方法更倾向于防止任何错误,即使以牺牲灵活性为代价。接口中未定义的属性的显式实现应该是编译器错误。显式实现是连接到接口的“私有方法”。如果不转换到接口,就不能在实现类上调用它们。因此,添加的访问器将是静态不可访问的。无法从接口调用它,因为它不是接口的成员,也无法从实现类调用它,因为它是私有的。很快,它就应该是有效的,因为“VB14中的新语言功能”(查找“ReadWrite props可以实现只读接口属性”)
Interface I
ReadOnly Property P As Integer
End Interface
Class C : Implements I
Public Property P As Integer Implements I.P
End Class
public class Implementer : IPublicProperty
{
private string _publicProperty;
string IPublicProperty.PublicProperty // explicit implementation
{
get
{
return _publicProperty;
}
set
{
_publicProperty = value;
}
}
}