Req17: Define extension methods in an "extension class" of the extended type
[This post is part of a series, "wish-list for future versions of VB"]
IDEA: Allow extension methods to be defined in their "extension class". It would look like this:
Dim x = "hello"
x.LogToDisk() ' extension method defined on strings
Dim y = x.p ' extension property defined on strings
<Runtime.CompilerServices.Extension>
Class String
<Runtime.CompilerServices.Extension()>
Sub LogToDisk()
My.Computer.FileSystem.WriteAllText("c:\log.txt", Me, True)
End Sub
<Runtime.CompilerServices.Extension()>
ReadOnly Property p As Integer
Get
Return Me.Length + 42
End Get
End Property
End Class
This would be a useful syntax for defining extension properties. It would also allow tricks like the following: code that looks like a method, but is robust against being called on a "null reference".
Class Fred
<Runtime.CompilerServices.Extension()>
Function ToString2() As String
If Me Is Nothing Then Return "_"
Return Me.ToString()
End Function
Public Overrides Function ToString() As String
Return "hello fred"
End Function
End Class
Provisional evaluation from VB team: It's bad enough that extension methods currently work on a null "Me" pointer already. We don't think it's good language design to make such a thing even easier: it feels like it would lead to more confusion than readability.
Comments
Anonymous
February 16, 2010
How about narrowing the scope so that just Enumerations allow extension methods? Or even better, just allow Enumerations to have instance methods that are compiled as extension methods in a matching module "[EnumName]Extension".Anonymous
February 17, 2010
I can't under stand why a Shared Public Method in a Class can not be attributed to be an Extension Method, if the first parameter is of the class type?Anonymous
February 18, 2010
Don't like how this is proposed. I agree with Adam. Extensions should be able to be declared as static methods inside not inheritable classes or static classes.Anonymous
October 06, 2010
How about allowing the second construct (ToString2) with a new NullableMeAttribute, which could even apply to a class to mean it applies to all its "instance" methods and properties.Anonymous
January 11, 2011
Why not have a Shared Class in VB.NET, I think the C# static class is just like a NotInheritable class that all its memebers are shared, it's definitely not a Module.