I create class
'MyLib.aspx
Namespace MyLib
Public Class Base
Public Shared _XPage As Page
Public Shared _Func As FuncClass
Public Shared Property XPage() As Page
Get
Return _XPage
End Get
Protected Set(Val as Page)
_Page = Val
End Set
End Property
Public Sub New(ByVal Page As Page)
XPage = Page
End Sub
End Class
Public Class FuncClass : Inherits Base
Public Sub New()
MyBase.New(_XPage)
End Sub
Public Function Test() As String
Return "Test"
End Function
End Class
End Namespace
I try it...
'ASPX_Page.aspx
Import MyLib
Partial Class ASPX_Page
Private ReadOnly LibX As Base = New Base(Me)
Protected Sub Button1_Clcik(sender As Object, e As EventArgs)
Handles Button1.Clcik
'Access of shared member through an instance;
'qualifying expression will not be evaluated
LibX._Func.Test()
End Sub
End Class
IDE show Warning message "Access of shared member through an instance; qualifying expression will not > be evaluated", but still working fine
why it show warning message , How can I fix it?
Мне кажется довольно странным, что в вашем классе Base
есть поле производного типа FuncClass
.
Вы получаете предупреждение, потому что _Func
— это Shared
, а доступ к членам Shared
должен осуществляться через тип, членом которого они являются, а не через экземпляр этого типа. Этот:
LibX._Func.Test()
пытается получить доступ к _Func
через экземпляр класса Base
, а не через сам класс. Это должно быть так:
Base._Func.Test()
Если вы хотите, чтобы ваше поле _Func
было специфичным для экземпляра, не объявляйте его Shared
, а если вы не хотите, чтобы оно было специфичным для экземпляра, не обращайтесь к нему через конкретный экземпляр.
Обратите внимание, что это предупреждение, а не ошибка. Если вы получите доступ к члену Shared
через экземпляр, система автоматически проигнорирует экземпляр и будет использовать тип, но сообщит вам об этом. Вот почему вам говорят, что определяющее выражение, то есть LibX
, не будет оцениваться. Это происходит потому, что кто-то может использовать метод, который возвращает экземпляр, а не просто переменную, и этот метод не будет вызываться, поэтому ничего другого, что делает этот метод, не произойдет.
Общий доступ в VB.net равен статическому в С#. Вы можете получить доступ к статическим ресурсам по экземпляру.