This post originated from an RSS feed registered with .NET Buzz
by Adrian Florea.
Original Post: Overloading non-generic virtual methods in generic classes (C# vs VB.NET)
Feed Title: Web Log di Adrian Florea
Feed URL: /error.aspx?aspxerrorpath=/adrian/Rss.aspx
Feed Description: "You know you've achieved perfection in design, not when you have nothing more to add, but when you have nothing more to take away." Antoine de Saint-Exupery
Ho notato un comportamento diverso (C# vs VB.NET) per l'overloading di metodi virtuali non-generici in classi generiche e, come notava il buon Raffaele in una discussione sul messenger "la regola di scegliere l'una o l'altra non è dettata dal CLS e qui scoppiano i problemi quando traduci un listato - un bel pasticcio". Lo snippet C# sotto:
Imports System Class Foo PublicOverridableSub DoSomething(ByVal o AsObject) Console.WriteLine("void Foo::DoSomething(object)") EndSub EndClass Class Bar(Of T) : Inherits Foo PublicOverloadsSub DoSomething(ByVal t As T) Console.WriteLine("void Bar<T>::DoSomething(T)") EndSub PublicOverridesSub DoSomething(ByVal o AsObject) Console.WriteLine("void Bar<T>::DoSomething(object)") EndSub EndClass Class Baz : Inherits Foo PublicOverridesSub DoSomething(ByVal o AsObject) Console.WriteLine("void Baz::DoSomething(object)") EndSub EndClass Module Test Sub Main() Dim bar As Bar(OfObject) = New Bar(OfObject) Dim baz As Baz = New Baz bar.DoSomething(NewObject) baz.DoSomething(NewObject) EndSub EndModule
otteniamo il comportamento di VB.NET. Sinceramente all'inizio ero tentato di dare ragione a VB.NET, però in effetti Raf mi ha convinto del fatto che, in questo ultimo snippet C# (questo subito sopra) noi chiediamo esplicitamente al compilatore un comportamento polimorfico mentre nei due snipet C# e VB.NET a confronto il comportamento polimorfico è soltanto implicito e quindi, potendo scegliere, il compilatore C# chiama "quella più tipizzata". Nel caso di baz, "non hai alternative, c'è solo quella e la usa sempre". E' vero.
Magari Corrado potrebbe postare sulla mailing list di VB.NET il domandone a Paul Vick? Sarebbe interessante sapere le motivazioni che hanno determinato il team VB.NET di fare questa scelta.