Avatar billede dingemann Novice
30. september 2016 - 12:10 Der er 8 kommentarer og
1 løsning

VB.NET > Default Property ved implementering af IList(Of T) og IList

Jeg har stødt på problemet før men fik det ikke løst dengang. Nu er jeg ramlet ind i problemet igen og er rimelig nysgerrig efter løsningen.
Jeg sidder og er ved at oversætte noget C# til VB.NET og grundlæggende kan mit spørgsmål koges ned til en linjes kode der ikke rigtig spiller i VB.NET.

Public Class Test(Of T) : Implements IList(Of T), IList
Når der trygges Return for enden af linjen implementerer IntelliSense selv metoderne og det er her den går gal. Default Property'en på Item bliver implementeret med

Default Private Property IList_Item(index As Integer) As Object Implements IList.Item

samt

Default Public Property Item(index As Integer) As T Implements IList(Of T).Item

Og det er jo forkert på mange måder. Spørgsmålet er derfor: er det ikke muligt at implementere to interfaces med identiske Default Property-name i VB uden at det bliver gjort 'grimt'?
Avatar billede dingemann Novice
30. september 2016 - 12:14 #1
Fåk en stavefejl... trygges = trykkes. Jeg plejer ellers at været ret fascistisk med stavefejl.
Avatar billede arne_v Ekspert
30. september 2016 - 16:02 #2
Jeg tror ikke at der er nogen god loesning.

C# understoetter ikke return type covariance, saa en Item der returnerer T og en Item der returnerer object er to forskellige properties.

Return type indgaar ikke i C# property signatur og derfor skal de have forskellige navne.

Og saa kan det navn vel vaere ligesaa godt som ethvert andet navn.

Men er du sikker paa at du behoever IList ?
Avatar billede arne_v Ekspert
30. september 2016 - 16:21 #3
Hmm. Erstat C# med VB.NET ovenfor.

:-)
Avatar billede dingemann Novice
30. september 2016 - 16:35 #4
Hej Arne,
Hvor er jeg glad for at du vælger at svare - internettet ville være et skidt sted uden dig.
Jeg tror måske at jeg fik formuleret mig lidt forhastet. Det beklager jeg.
Formålet er at oversætte noget C#-kode til VB.NET.

I VB.NET får jeg et problem når jeg skriver klassen

Public Class Test(Of T) : Implements IList(Of T), IList

og så trykker Return hvor IntelliSense så selv laver metode/property/osv-implementeringerne.

Problemet er helt konkret Default Property som C# nemt kan implementere fra både IList(Of T) og IList. Men VB.NET går i ged pga navnene.

I C# har jeg ingen problemer med at skrive
public class Class1<T> : IList<T>, IList
{
}

og så implementere alle properties osv...

Det ses jo med C#'s
object IList.this[int index]
{
    get { throw new NotImplementedException(); }
    set { throw new NotImplementedException(); }
}

samt

public T this[int index]
{
    get { throw new NotImplementedException(); }
    set { throw new NotImplementedException(); }
}
... de to properties kan co-existere uden at drille hinanden.

Det kan de ikke i VB. Her tænker jeg mere præcist på C#-linjen der ikke kan oversættes til samme explicitte udtryk med IList efterfulgt af punktum og så navn:

object IList.this[int index]

Det får VB til at gå i hejs fordi den gerne vil have to Default Propery med samme navn (Item) og det kan man ikke og derfor får jeg røde streger når IntelliSense auto-implementerer fra IList(Of T) og IList. Det samt at IntelliSense selv finder på at lave navnet som IList_Item som jo er dybt gonnat.
Avatar billede arne_v Ekspert
30. september 2016 - 17:06 #5
Jeg tror stadigvaek ikke at jeg har forstaaet problemet.

Lad mig illustrere med et simpelt eksempel (interfaces med faerre metoder).

C#:


using System;

namespace E
{
    public interface IList<T>
    {
        T this[int ix] { get; }
    }
    public interface IList
    {
        object this[int ix] { get; }
    }
    public class MyList<T> : IList<T>, IList where T : class
    {
        public T this[int ix]
        {
            get
            {
                Console.WriteLine("IList<T>.Item");
                return null;
            }
        }
        object IList.this[int ix]
        {
            get
            {
                Console.WriteLine("IList.Item");
                return null;
            }
        }
    }
    public class Program
    {
        public static void Main(string[] args)
        {
            object dummy;
            IList<string> o1 = new MyList<string>();
            dummy = o1[0];
            IList o2 = new MyList<string>();
            dummy = o2[0];
            MyList<string> o3 = new MyList<string>();
            dummy = o3[0];
            Console.ReadKey();
        }
    }
}


VB.NET:


Imports System

Namespace E
    Public Interface IList(Of T)
        Default ReadOnly Property Item(ix As Integer) As T
    End Interface
    Public Interface IList
        Default ReadOnly Property Item(ix As Integer) As Object
    End Interface
    Public Class MyList(Of T As Class)
        Implements IList(Of T)
        Implements IList
        Public Default ReadOnly Property Item(ix As Integer) As T Implements IList(Of T).Item
            Get
                Console.WriteLine("IList<T>.Item")
                Return Nothing
            End Get
        End Property
        ReadOnly Property IList_Item(ix As Integer) As Object Implements IList.Item
            Get
                Console.WriteLine("IList.Item")
                Return Nothing
            End Get
        End Property
    End Class
    Public Class Program
        Public Shared Sub Main(args As String())
            Dim dummy As Object
            Dim o1 As IList(Of String) = New MyList(Of String)()
            dummy = o1(0)
            Dim o2 As IList = New MyList(Of String)()
            dummy = o2(0)
            Dim o3 As New MyList(Of String)()
            dummy = o3(0)
            Console.ReadKey()
        End Sub
    End Class
End Namespace


De ser rimeligt ens ud i mine oejne.

C# bruger IList.this mens VB.NET bruger IList_Item, men det er ikke saa forskelligt.
Avatar billede Slettet bruger
03. oktober 2016 - 13:09 #6
hmmm... jeg ville bare gerne at VB også brugte IList.Item istedet for. Det generer mig at VB bliver nødt til at konstruere et nyt navn.
Avatar billede dingemann Novice
03. oktober 2016 - 13:13 #7
pis... den gik lige i ged. Kom til at oprette en bruger istedet for at logge ind. Så jeg fik oprettet en bruger med forkert mail.
Men mit svar er stadig det samme:

"hmmm... jeg ville bare gerne at VB også brugte IList.Item istedet for. Det generer mig at VB bliver nødt til at konstruere et nyt navn."
Avatar billede arne_v Ekspert
03. oktober 2016 - 14:42 #8
Men du bruger jo ikke navnet.

ox[0]
ox(0)

viser jo ikke navnet - det findes kun i klasse definitionen.
Avatar billede dingemann Novice
19. oktober 2016 - 15:38 #9
Hej Arne,
Du har ret! Smider du et svar?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester