Comments (10)
For anyone now facing a mass migration, the following RegEx might be helpful. In VS's Replace in files:
Requires\.NotNull\((\w+), nameof\(\1\)\);
Requires.NotNull($1);
Also:
Requires.NotNullAllowStructs
Requires.NotNullOrEmpty
Requires.NotNullOrWhiteSpace
Requires.NullOrNotNullElements
Requires.NotNullEmptyOrNullElements
Requires.NotEmpty
Requires.Defined
Requires.NotDefault
Calls to Assumes.True(bool, string)
and Assumes.False(bool, string)
likely require manual review.
from vs-validation.
Ok, so I did some testing, and maybe this is what @MichaelPeter was referring to, but this is not limited by lang version. It works just fine on LangVersion 7.3, for example, and when targeting net472. or netstandard2.0.
I'll prepare this change.
from vs-validation.
That sounds awesome. I wonder though how we can incorporate this without regressing the experience for the great majority of users that are still on C# 9 and older. If we make the second parameter optional then C# 9 would not prompt nor automatically fill in the attribute, leaving a missing parameter name in the exception.
from vs-validation.
I suppose we could multi-target and when .NET 6 is in use we might assume (unreliably) that the user is using C# 10 and only apply the default parameter value and attribute in the net6 compilation. That would be somewhat tedious to maintain though, and C# 10 users may exist while targeting less than .NET 6 and .NET 6 users may not be using C# 10, so it's an imprecise design too.
from vs-validation.
One approach would be to add an analyzer.
Personally I'd want this for use in VS, where we still target net472
.
from vs-validation.
True. An analyzer would have all the needed insight. In fact I think an analyzer could be written in a way that works for all calls to any method that uses this parameter attribute.
I don't think I'll have time to do this in the near future though, but we'll keep the issue active and take contributions.
from vs-validation.
Hi, we are currently looking for a contract framework and without that feature this framework is not an option.
Question: For older Language Versions, the attribute simply has no effect.
So for non C# 10+ Users the experience would be the same as before...
So would it not be an option to just add the attribute for everybody?
See here:
https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-10.0/caller-argument-expression
I think even for .NET Framework where the CallerArgumentExpressionAttribute doesn't exist,
You can just declare the type in the project with the same namespace and it works again.
from vs-validation.
So for non C# 10+ Users the experience would be the same as before...
It wouldn't be though. The attribute is to be applied to an optional parameter. But the parameter will be optional regardless of language version, even though the attribute only works on C# 10+. So all the C# 9- users would be likely to omit the parameter by accident, producing a much less desirable result when the exception is thrown.
I could still add the analyzer and/or only add the attribute and make the parameter optional for the .NET 6 targeted projects to mitigate that.
from vs-validation.
@AArnott I actually did not consider, that the parameterName are is not yet an optional parameter. You are right.
Ok, so I did some testing, and maybe this is what @MichaelPeter was referring to, but this is not limited by lang version. It works just fine on LangVersion 7.3, for example, and when targeting net472. or netstandard2.0. I'll prepare this change.
Ohh really? It works with 7.3? My experience was with previous versions of C# that the parameter value of the parameterName would simply stay null. They Introduced the Attribute in C# 5.0 but only provided support for it in C# 10.
Yes to my knowlege it was independent of the framework version, so you can use it in .net472. Only requirement is you have a visual studio version which supports C# 10 (and have not explicitly set the project to a language version before C# 10.0)
But seems I am wrong when it worked with 7.3
from vs-validation.
My experience was with previous versions of C# that the parameter value of the parameterName would simply stay null.
You were close. The significant difference is compiler version rather than language version. If the feature came out in C# (language version) 10, then any compiler that supports C# 10 will work, without regard to the language version setting. I believe that means any version of VS 2022 is acceptable.
And yes, the sad fallback from this change is that anyone using an older compiler (i.e. VS 2019) will be tempted to omit arguments and null
will be passed in instead of the parameter name, without any warning. But VS 2022 has been out for quite a while now, so I think this is a bigger win than a loss.
from vs-validation.
Related Issues (17)
- Requires.NotNull should accept values of type `T?` HOT 1
- Please release a more recent version of this package HOT 1
- Add helper for adding data to an exception while throwing it
- Add analyzer and code fix provider for Requires.NotNull/Range HOT 1
- Nuget package is getting flagged by ClearlyDefined as containing source code under LGPL-2.1 license HOT 2
- Support nullable reference feature better with attribute HOT 14
- Remove `T : EventArgs` type constraint from `Raise<T>`
- Assumes.Is<T> should include a [NotNull] attribute
- Assumes.NotNull support Nullable<T> struct HOT 3
- Incorrect description of Requires.NotNullOrEmpty for enumerables
- .NET Core SDK adoption blockers
- Replace the single-iteration foreach loops
- Package project URL is wrong HOT 2
- Add NotDefault and ValidElements HOT 2
- Overload Requires.NotNullOrEmpty to avoid enumerator allocation HOT 4
- For 3rd party usage of this library, allow customing default exception messages to not mention Microsoft Support HOT 3
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 vs-validation.