-
Notifications
You must be signed in to change notification settings - Fork 4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Proposal: Type constraint for constructor with parameter #2206
Comments
I think I have seen this request more than once already. Currently this runs into a limitation where CLR provides no way to express this. Another thing to note - "new T" actually uses Activator in its implementation, and Activator internally uses reflection over ConstructorInfo, so in that sense "new T" is not the way to avoid these APIs, it just makes code look nicer. |
I would deeply like this feature too. In regards to expression with the CLR you guys said at build that although you don't want to modify the CLR it was not out of reach so to speak. So if you do end up planning on updating the CLR in C# 7 (VB 15?) would this be an unreasonable request? If new T just uses Activator why do people notice a perf difference between the two implementations? And if new T just uses Activator then wouldn't it be possible for compiling into the current CLR to just use the formatting as syntactic sugar and where the constructor is used convert into the use of Activator? |
@ocbaker Unfortunately there is no way to use |
@gafter What about either improving Button button = Activator.GetInstanceCreator<Func<IUiContext, Button>>().Invoke(ctx); My quick attempt at implementing it using
(Though I believe at least |
I just finished the first draft of this library to work around issues like this and similar. It generates IL and types on the fly to achieve this and allows having some level of typesafety as well. |
Please, please, please can we get this into the language? |
Nearly 2 years and still planning.... Anyone could enlighten me why this very crucial feature is so hard to implement? |
@Thaina it requires a revision of the CLI specification, and work on every implementation of the CLR. |
@gafter Would you recon this feature might make it into c# 8? On some issue i've read that features which require CLR work should be done in combination, to keep required changes to CLR at a minimum |
Since we are closing language discussions on Roslyn in favor of csharplang, perhaps we should just close and link to the existing dotnet/csharplang#769? |
We are now taking language feature discussion in other repositories:
Features that are under active design or development, or which are "championed" by someone on the language design team, have already been moved either as issues or as checked-in design documents. For example, the proposal in this repo "Proposal: Partial interface implementation a.k.a. Traits" (issue 16139 and a few other issues that request the same thing) are now tracked by the language team at issue 52 in https://github.com/dotnet/csharplang/issues, and there is a draft spec at https://github.com/dotnet/csharplang/blob/master/proposals/default-interface-methods.md and further discussion at issue 288 in https://github.com/dotnet/csharplang/issues. Prototyping of the compiler portion of language features is still tracked here; see, for example, https://github.com/dotnet/roslyn/tree/features/DefaultInterfaceImplementation and issue 17952. In order to facilitate that transition, we have started closing language design discussions from the roslyn repo with a note briefly explaining why. When we are aware of an existing discussion for the feature already in the new repo, we are adding a link to that. But we're not adding new issues to the new repos for existing discussions in this repo that the language design team does not currently envision taking on. Our intent is to eventually close the language design issues in the Roslyn repo and encourage discussion in one of the new repos instead. Our intent is not to shut down discussion on language design - you can still continue discussion on the closed issues if you want - but rather we would like to encourage people to move discussion to where we are more likely to be paying attention (the new repo), or to abandon discussions that are no longer of interest to you. If you happen to notice that one of the closed issues has a relevant issue in the new repo, and we have not added a link to the new issue, we would appreciate you providing a link from the old to the new discussion. That way people who are still interested in the discussion can start paying attention to the new issue. Also, we'd welcome any ideas you might have on how we could better manage the transition. Comments and discussion about closing and/or moving issues should be directed to #18002. Comments and discussion about this issue can take place here or on an issue in the relevant repo. This is part of a proposal being tracked at dotnet/csharplang#110 which is under active development at MSR (Microsoft Research). |
Current type constraints allow us to specify that the class must have a default constructor:
but we cannot specify that a class must provide a non-default constructor. When you consider the generally-recognized benefits of dependency inversion and when you consider that injecting dependencies via constructor is generally considered superior to injecting via properties and initialization methods, this seems like a very good feature to have.
Any time we have to create objects from a family with common dependencies, this could help reduce required code. Consider the example of a factory for creating UI controls. We might take a string with the name of the type you're creating and a UI Context object which is always passed to all constructors:
We could dramatically shrink this method, in addition to improving type safety and removing casts, by converting to generic with a constraint that allowed us to specify a non-default constructor:
Lots of really ugly code involving
Activator
and reflection overContructorInfo
lists could be removed entirely, in addition to helping support proper dependency inversion of types created generically.The text was updated successfully, but these errors were encountered: