为什么可以';当在C#.NET中有效时,是否在VB.NET中重写t接口只读属性?

为什么可以';当在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

(这与)

如果定义了一个接口,其中有一个属性只有一个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 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;
        }
    }
}