Open YairHalberstadt opened 3 years ago
If you change P.Length to C.P.Length, it compiles, which to my mind argues that it is a bug. Instance or not shouldn’t ever impact nameof, that’s just confusing.
I have an implementation at https://github.com/dotnet/roslyn/pull/48754
I know c# isn't vb, but I was extremely surprised to find out that the equivalent of:
Sub Main
Dim d = New Dictionary(Of String, String)
Console.WriteLine(Nameof(d.First().Key))
End Sub
void Main()
{
var d = new Dictionary<string, string>();
Console.WriteLine(nameof(d.First().Key));
}
doesn't work.
Sub Main Dim d = New Dictionary(Of String, String) Console.WriteLine(Nameof(d.First().Key)) End Sub
This doesn't compile in VB either though: https://sharplab.io/#v2:EYLgtghglgdgNAGxAN2HALiKC4BMQDUAPgJJgAOA9gE7oDOABAMoCed6ApmALABQZVWo1bsuAOgDClBAg4BjdFEow6YgOIcYHalDl8+ABQCuwBLoYSEEOowl8GD5iYYBZaDHuOvAEShgGuAwAvAwAchwA7gy+CkowENQsABQA8gBmzOg6MADmcJnZOQCUnl4OUirSHGIA6jqcADKwHEmhEGAc6Um4YgBiUNTsSUViANIcLEUlvF4AojCBTCZ884GW1nRAA==.
I think no update to C# spec is needed. The quote in this issue comes from closed PR https://github.com/dotnet/csharpstandard/pull/10. The current spec looks fine: §11.7.20 Nameof expressions.
@333fred
@333fred :
Sub Main Dim d = New Dictionary(Of String, String) Console.WriteLine(Nameof(d.First().Key)) End Sub
This doesn't compile in VB either though:
If you use:
Sub Main
Dim d = New Dictionary(Of String, String)
Console.WriteLine(NameOf(d.First.Key))
End Sub
Same with open generic types.
nameof(Foor<>.Bar)
doesn't work, but nameof(Foo<object>.Bar)
does. Why do I need to specify a type argument if i just want the string "Bar"
?
That is quite a wart. Discussion: https://github.com/dotnet/csharplang/discussions/2547
To keep the spec simple the design of nameof
was that it involve no new syntax, it took only what would be already legal syntax and replaced what appeared to be a method invocation with the name constant, if there was no method named nameof
in scope. As M(Foo<>.Bar)
was not legal syntax, neither would nameof(Foo<>.Bar
) be. At this point it feels like this decision has created enough warts that need to be individually addressed that IMO it should be up for reconsideration, especially in the context of potentially making nameof
a proper keyword instead of contextual.
Allow nameof to always access instance members from static context
Summary
For background see https://github.com/dotnet/roslyn/pull/48754
The current compiler has some interesting behavior with regards to accessing instance members from a static context:
Where even though
P
is an instance member you can access it from a static context, but you can't accessP.Length
.The relevant part of the spec is this:
This is somewhat ambiguous, but can be interpreted as saying only the top level lookup ignores errors where an instance member was found in a static context, but nested lookups do not. See here https://github.com/dotnet/roslyn/pull/48754#issuecomment-712295307.
My request here is twofold:
Motivation
Detailed design
Update the spec from:
To
Drawbacks
This is not a particularly common scenario, and so probably not worth changing the spec for, if it's decided that the current implementation is not a bug.
Alternatives
Unresolved questions
Design meetings
https://github.com/dotnet/csharplang/blob/master/meetings/2020/LDM-2020-11-11.md#allow-nameof-to-access-instance-members-from-static-contexts