Comments (8)
I expected the call to T.DoSomething() in GenericMethod(); to be routed to static void SubclassAB.DoSomething() but instead it's routed to SubclassA..
Because you created a method unrelated to the interface. It's not an interface impl, and it's def in its own slot (which is why if you remove new
we'll warn you of that).
I assume the reason is that the generic-method-instantiation logic in the CLR performs a top-down search for binding static methods - instead of bottom-up
Neither of these are incorrect. This is a non-virtual method. So there is no 'search'ing happening at all. The method being called is determined statically at compile time and the CLR just invokes the method requested by you.
in which case I expect Roslyn to raise a diagnostic (i.e. a warning) at the GenericMethod(); call-site, with a message like: "Static methods in SubclassAB will not be invoked.
We can't warn here. This is an entirely reasonable piece of code to write. If you'd like a custom warning here, you'd need to write your own analyzer.
both with and without the new modifier
The 'new' modifier does not impact semantics at all. it's just a way for a user to say they understand that one method hides another, and has no virtual inheritance relationship with it. This is often a bug, so new
is needed to indicate that "yes, that hiding was intended".
from roslyn.
So there is no 'search'ing happening at all.
The JIT surely has to search from SubclassAB
to ClassA
to find the IMyInterface
implementation and bind the static call-sitesa, no?
This is an entirely reasonable piece of code to write
Why is it reasonable to specify a more-derived type as a type-parameter when the effect is the same as the less-derived type? When would anyone do that?
The 'new' modifier does not impact semantics at all.
Right - I wasn't suggesting that it does - but I think it's odd that shadow methods were deemed confusing enough to warrant a compiler warning, but subclassed static interface methods were not. It just feels abitrary to me.
...especially as this isn't documented at all right now. Hence it took me by surprise.
from roslyn.
Why is it reasonable to specify a more-derived type as a type-parameter
For any number of reasons. Including that the code in question might care about that type-parameter versus the base type.
when the effect is the same as the less-derived type?
There's no concept of "the effect is hte same". The compiler has no idea what happens inside a method body (remember that they can come from metadata, and we want uniform compilation behavior for source vs metadata).
from roslyn.
The JIT surely has to search from SubclassAB to ClassA to find the IMyInterface implementation and bind the static call-sitesa, no?
For the static-virtuals, yes. For the non-virtuals, no. If you use static-virtuals (and have a more derived impl, it will be called).
from roslyn.
If you use static-virtuals (and have a more derived impl, it will be called).
So regardless of the use of static abstract
members, given a class A : IInterface
and a class B : A
, the class B
is not considered a more-derived-implementation of IInterface
because only A
implements IInterface
unless it's class B : A, IInterface
?
from roslyn.
Correct. And we even warn you about that. but you suppressed the warning by putting 'new' on teh method :)
from roslyn.
Correct.
Thank you, that does clarify and explain things.
And we even warn you about that. but you suppressed the warning by putting 'new' on teh method :)
The new
warning is the same for both class SubclassAB
and class SubclassABI
though.
warning CS0108: 'SubclassAB.DoSomething()' hides inherited member 'ClassA.DoSomething()'. Use the new keyword if hiding was intended.
warning CS0108: 'SubclassABI.DoSomething()' hides inherited member 'ClassA.DoSomething()'. Use the new keyword if hiding was intended.
...but only SubclassABI.DoSomething()
is considered an implementation of IMyInterface.DoSomething
.
from roslyn.
yup. :)
from roslyn.
Related Issues (20)
- Error in 【MSBuildWorkspace.Create() .OpenSolutionAsync()】:System.Exception (cannotfound BuildHost) HOT 1
- ISymbol.ToMinimalDisplayString() ignores the SymbolDisplayTypeQualificationStyle.NameOnly formatting option. HOT 2
- [Bug] IDE0058 not work
- Task List filtering for current project doesn't work as expected
- switch expression: Warning CS8524 issued although all cases have been covered HOT 5
- Add assembly version information to method tooltips
- Automatic class initialization scaffolding
- Add string to NameOf option in intellisense
- Add IL Viewer for .NET languages
- Make fields generated in a primary constructor able to be readonly HOT 1
- Can't see primary constructor variables in debugger
- Run a single generator at a time HOT 1
- Prepend $(NoWarn) to list analyzer rule generates a false positive. HOT 1
- Add compiler warning about CS file name not matching the class/interface contained within
- [Automated] PRs inserted in VS build feature.debugger.main-35020.110
- [Automated] PRs inserted in VS build main-35020.20
- Code Lens doesn't show references on Source Generated files
- Error/Warning messages on network share are not navigable HOT 1
- Cycle in required members
- Microsoft.DotNet.GenAPI.Tests/CSharpFileBuilderTests.cs in SDK repo test failures
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from roslyn.