Register a SA Forums Account here!
JOINING THE SA FORUMS WILL REMOVE THIS BIG AD, THE ANNOYING UNDERLINED ADS, AND STUPID INTERSTITIAL ADS!!!

You can: log in, read the tech support FAQ, or request your lost password. This dumb message (and those ads) will appear on every screen until you register! Get rid of this crap by registering your own SA Forums Account and joining roughly 150,000 Goons, for the one-time price of $9.95! We charge money because it costs us money per month for bills, and since we don't believe in showing ads to our users, we try to make the money back through forum registrations.
 
  • Post
  • Reply
EssOEss
Oct 23, 2006
128-bit approved

EmmyOk posted:

I realised that I'd created a .NET Core project instead of .NET Framework :doh:

Windows Compatibility Pack will make this also work on .NET Core some day, in case you need it.

Adbot
ADBOT LOVES YOU

Mr Shiny Pants
Nov 12, 2012

Have you tried running multiple instances of the existing software? Maybe run that in Azure?

MisterZimbu
Mar 13, 2006
Ugh, this is driving me insane. Razor integration in VS has always been flaky.

VS2017 professional, Core MVC 2.0. Intellisense isn't working well in Razor files - namely, I'm not getting function/constructor parameters. Syntax highlighting works well and I'm getting intellisense for types themselves, but not for function parameters.

chippy
Aug 16, 2006

OK I DON'T GET IT
What do y'all like to call variables which point to Tasks?

I mean for stuff like this:

code:
var connectToClientTask = ConnectToClient();

// do some other stuff that we can do while waiting for the connection

var client = await connectToClientTask;
I tend to name then with Task on the end as I have above, but that feels a bit close to Hungarian notation which I'm not a fan of at all.

New Yorp New Yorp
Jul 18, 2003

Only in Kenya.
Pillbug

chippy posted:

What do y'all like to call variables which point to Tasks?

I mean for stuff like this:

code:
var connectToClientTask = ConnectToClient();

// do some other stuff that we can do while waiting for the connection

var client = await connectToClientTask;
I tend to name then with Task on the end as I have above, but that feels a bit close to Hungarian notation which I'm not a fan of at all.

I think "task" is fine. You could also call it "runningClientConnection" or "incompleteConnection" or "attemptingClientConnection" or something that indicates that it's an in-progress activity.

LOOK I AM A TURTLE
May 22, 2003

"I'm actually a tortoise."
Grimey Drawer

chippy posted:

What do y'all like to call variables which point to Tasks?

I mean for stuff like this:

code:
var connectToClientTask = ConnectToClient();

// do some other stuff that we can do while waiting for the connection

var client = await connectToClientTask;
I tend to name then with Task on the end as I have above, but that feels a bit close to Hungarian notation which I'm not a fan of at all.

"Hungarian notation" is specifically about 1. Short prefixes to indicate the type/role of a variable, and 2. The pervasive use of these on all or almost all variables in the codebase. I find it silly to dismiss all variable names that allude to the variable type in their names just because people went overboard with it in the past. Just call it "fooTask".

On the subject of Hungarian notation and Tasks, something I do find unnecessary in most cases is the overused "Async" suffix. I get the point for library code where you often have a sync/async method pair and you want to make it clear which is which, but in app code I really don't see the point. Imagine if every method that returns an IEnumerable was supposed to be called something like GetThingsLazy() instead of just GetThings(), or if every method whose return value might be null was supposed to be GetThingNullable(). GetThingsAsync() is the same thing IMO.

bobua
Mar 23, 2003
I'd trade it all for just a little more.

Is SQLDependency the right way to do server change notifications? I've got a tiny wpf app that a few people use. Originally I jammed in a timer with a check of the lastupdated datetime column every few minutes but it feels dirty.

Stuff like SignalR gets all the google search love but it seemed like more of a web thing. Using SQLDependency with entity framework returns so little in google that I really felt like I was barking up the wrong tree.

EssOEss
Oct 23, 2006
128-bit approved
Unlikely. I would flip the question around entirely: what makes you think you need change notifications? What is the actual goal of your app?

bobua
Mar 23, 2003
I'd trade it all for just a little more.

A few people sit and work on 'orders' all day, randomly. These are shown in detail and in a grid. I don't want the user to have to do something to ensure a record they are looking at is up to date(like someone else changing a time). If it's visible on the screen, it should be relatively up to date even if the pc is completely idle.

Macichne Leainig
Jul 26, 2012

by VG
Found this :wtf: code in my work's codebase, figured I would share.

code:
foreach (string value in optionsObject.StringValues.Where(value => value == "SingleValue"))
{
    requestObject.PropertyValue = value;
}
Variable names changed since they're specific to this business logic, but the syntax is unchanged.

Yes, it filters down a collection to a single value, then does a foreach loop on the filtered collection, then sets a single property value on a single object to the filtered value. :thumbsup:

If only there was some sort of assignment operator to easily set a string property to an arbitrary string!

Night Shade
Jan 13, 2013

Old School

Protocol7 posted:

Yes, it filters down a collection to a single value, then does a foreach loop on the filtered collection, then sets a single property value on a single object to the filtered value. :thumbsup:
It also leaves requestObject unmodified if the collection doesn't contain SingleValue. It also invokes the side effects of PropertyValue_set (if any) once per duplicate of SingleValue in StringValues.

If there aren't any side effects you could rewrite it as
code:
if (optionsObject.StringValues.Contains("SingleValue")) {
  requestObject.PropertyValue = "SingleValue";
}
which is certainly clearer but not really smaller.

amotea
Mar 23, 2008
Grimey Drawer
Good news everyone! We might be able to dodge the JS bullet after all!

https://blogs.msdn.microsoft.com/webdev/2018/02/06/blazor-experimental-project/

Munkeymon
Aug 14, 2003

Motherfucker's got an
armor-piercing crowbar! Rigoddamndicu𝜆ous.



amotea posted:

Good news everyone! We might be able to dodge the JS bullet after all!

https://blogs.msdn.microsoft.com/webdev/2018/02/06/blazor-experimental-project/

I certainly like the idea of importing a thing that'll make my existing cshtml behave like a SPA. Dealing with the inevitable bugs might even be easier than a re-write :unsmith:

epswing
Nov 4, 2003

Soiled Meat

amotea posted:

Good news everyone! We might be able to dodge the JS bullet after all!

https://blogs.msdn.microsoft.com/webdev/2018/02/06/blazor-experimental-project/

Holy moly. I've been trying to convince myself to finally learn one of those JS frameworks. Maybe I don't need to??

Dietrich
Sep 11, 2001

I dunno, this seems like the kind of thing that's going to need to bake for a few years before it's ready to be used in any professional capacity.

Angular is a great framework for web app development that fits with SOLID OOD type developer's habits. If that describes you I'd take the time to learn it.

Just-In-Timeberlake
Aug 18, 2003
Is there anything that updating to the latest version of Windows 10 would make this code now return a different value from what it was returning a couple of weeks ago (or on an entirely different computer running Windows 7, they used to match)

code:
	Using sha512 As New System.Security.Cryptography.SHA512Managed
            Return BitConverter.ToString(sha512.ComputeHash(data))
        End Using
The windows update is the only thing I can think of that I've done recently that would cause this. If I run a project on the Windows 7 machine and then copy that exact project over to the Windows 10 machine and run them the outputs are different.

NihilCredo
Jun 6, 2011

iram omni possibili modo preme:
plus una illa te diffamabit, quam multæ virtutes commendabunt

Dietrich posted:

I dunno, this seems like the kind of thing that's going to need to bake for a few years before it's ready to be used in any professional capacity.

This. However, https://bridge.net/ has been around for a few years, and is a much better choice if you want to run C# in the browser in production in 2018.

epswing
Nov 4, 2003

Soiled Meat
Crossposting from the C++ thread, in case some windows people here have some advice:

epalm posted:

Anyone have experience dealing with an overactive Windows Defender? It's labeling one of our programs as "Trojan:Win32/Azden.B!cl" and immediately quarantines the file.



We've done full scans on all our developer machines, no threats found, etc. I've audited the changes since our last release (a month ago) and nothing really jumps out at me as a red flag. The (C++) program is compiled using VS 2015, and packaged using iexpress.exe/makecab.exe with a bunch of sed files. A few minutes after packaging (or if we manually copy the file somewhere), Windows complains. We've since moved on to greener pastures re: packaging/deployment, but this legacy app is still being maintained.

I guess Defender just sees some "bad" bytes in our executable? I've submitted the file to Microsoft. Anything I can do in the meantime?

EssOEss
Oct 23, 2006
128-bit approved

Just-In-Timeberlake posted:

Is there anything that updating to the latest version of Windows 10 would make this code now return a different value from what it was returning a couple of weeks ago (or on an entirely different computer running Windows 7, they used to match)

code:
	Using sha512 As New System.Security.Cryptography.SHA512Managed
            Return BitConverter.ToString(sha512.ComputeHash(data))
        End Using

I see one thing here that might be different between the machines - whatever is in "data"!

If this does not lead to an obvious solution, post the full code with inputs that reproduces the issue.

Just-In-Timeberlake
Aug 18, 2003

EssOEss posted:

I see one thing here that might be different between the machines - whatever is in "data"!

If this does not lead to an obvious solution, post the full code with inputs that reproduces the issue.

Fair enough, I just wrote this to test it on each system

code:
    Sub Main()
        Using sha512 As New System.Security.Cryptography.SHA512Managed
            Console.WriteLine(BitConverter.ToString(sha512.ComputeHash(System.Text.Encoding.UTF8.GetBytes(("64338F8C-4EAF-474C-89F9-15F02A760C64").Reverse().ToString))))
        End Using
    End Sub
Now, if I just pass in that GUID into both Win10 & 7, the output matches.

This is used to create some salts so it actually calls another function to garble up some of the input ("data" variable in my previous post), so to mimic part of it I added the .Reverse() part up above and this is where the output differs between Windows versions

Windows 7, VS 2015, .NET 4.5.2
code:
3D-19-F3-F9-1B-57-61-FB-F0-02-9E-41-58-EB-FF-F7-9E-28-3F-B6-83-AE-EF-0F-8E-05-4B-27-F9-DC-A0-14-0E-47-2C-6B-D8-64-BC-3B-1F-B1-67-2E-0D-7D-53-2A-E9-B5-A1-54-4B-8D-2C-EB-3F-66-C4-8F-A6-FE-3B-1A
Windows 10, VS 2017, .NET 4.5.2
code:
4C-F2-B9-FF-25-3C-1B-27-FD-D1-8D-68-66-7F-59-4F-9F-B1-5A-A0-AB-A1-77-32-8E-67-E9-D1-D8-B4-7A-C3-3B-94-46-A1-B7-2E-E2-A8-19-E2-33-64-4F-C6-2D-30-C7-B2-43-3E-15-4E-4D-2B-DB-C9-0D-16-71-7D-B6-5C
The code is identical, I just copied it from one VM to another. So it looks like the hashing isn't the issue, but something is up with what is being hashed when the string gets manipulated. Any ideas?

edit:

If I just run this code:

code:
	Console.WriteLine(("abcdefghijklmnopqrstuvwxyz").Reverse())
I get 2 different outputs

Windows 7:
code:
	System.Linq.Enumerable+<ReverseIterator>d__74`1[System.Char]
Windows 10:
code:
	System.Linq.Enumerable+<ReverseIterator>d__75`1[System.Char]
So, why is Windows 10 outputting something different? I took a snapshot before installing the updates so worst comes to worst I can roll it back, but that means I can never update that VM and I'll be stuck dismissing the nag screen to update every other day.

Just-In-Timeberlake fucked around with this message at 21:34 on Feb 12, 2018

EssOEss
Oct 23, 2006
128-bit approved
Oh! If you print out your "data" variable after .Reverse().ToString(), you will find the reason for your conundrum:

code:
System.Linq.Enumerable+<ReverseIterator>d__75`1[System.Char]
The call to .ToString() just returns the type of the iterator, not the value! You need to call the String constructor to actually turn it back into a string.

code:
Console.WriteLine(BitConverter.ToString(sha512.ComputeHash(System.Text.Encoding.UTF8.GetBytes(new string(("64338F8C-4EAF-474C-89F9-15F02A760C64").Reverse().ToArray())))));
I assume you do not actually want to use the type name here, of course. That would be silly.

Just-In-Timeberlake
Aug 18, 2003

EssOEss posted:

Oh! If you print out your "data" variable after .Reverse().ToString(), you will find the reason for your conundrum:

code:
System.Linq.Enumerable+<ReverseIterator>d__75`1[System.Char]
The call to .ToString() just returns the type of the iterator, not the value! You need to call the String constructor to actually turn it back into a string.

code:
Console.WriteLine(BitConverter.ToString(sha512.ComputeHash(System.Text.Encoding.UTF8.GetBytes(new string(("64338F8C-4EAF-474C-89F9-15F02A760C64").Reverse().ToArray())))));
I assume you do not actually want to use the type name here, of course. That would be silly.

Ok, I can work around that, thanks for pointing me in the right direction.

Any idea why one is different than the other between Windows versions?

redleader
Aug 18, 2005

Engage according to operational parameters
How sure are you that data is the same between the two systems? Could there be some invisible characters (e.g. non-breaking spaces) in one of them? You could try comparing a hex dump of the two strings.

Find a third machine and see what that one does.

Just-In-Timeberlake
Aug 18, 2003

redleader posted:

How sure are you that data is the same between the two systems? Could there be some invisible characters (e.g. non-breaking spaces) in one of them? You could try comparing a hex dump of the two strings.

Find a third machine and see what that one does.

I literally copied and pasted from one VM to the other, can't see how something extraneous got in there.

Anyway, the problem is solved, I'm just curious why the <ReverseIterator> type returned is different between Windows versions.

NiceAaron
Oct 19, 2003

Devote your hearts to the cause~

Most likely ever-so-slightly different versions of the .NET framework.

Hell, the exact class is an implementation detail, so as long as it implements the interface it could return a different class with every call for all your code cares (or should care).

Edit: Since System.Linq.Enumerable+<ReverseIterator>d__74`1[System.Char] and System.Linq.Enumerable+<ReverseIterator>d__75`1[System.Char] appear to be the names of classes generated by the compiler for iterator blocks, it could be as simple as a method in System.Linq.Enumerable being added, removed, or moved around in the source code.

NiceAaron fucked around with this message at 06:19 on Feb 13, 2018

amotea
Mar 23, 2008
Grimey Drawer
Haha just remembered VS had those capitalized menu items in some release a while ago. :discourse:

biznatchio
Mar 31, 2001


Buglord

amotea posted:

Haha just remembered VS had those capitalized menu items in some release a while ago. :discourse:

I just happened to need to open Visual Studio 2013 for some testing today and was also reminded of WHAT A GOOD IDEA IT IS TO HAVE EVERYTHING IN CAPS.

bobua
Mar 23, 2003
I'd trade it all for just a little more.

I've got a SUPER tiny mvc site running locally. Every morning, the first query(entity framework) takes a good 30 seconds to 1 minute, then everything is instant after that. IIS and SQL are on the same server, and the server isn't restarting overnight. Any ideas?

Munkeymon
Aug 14, 2003

Motherfucker's got an
armor-piercing crowbar! Rigoddamndicu𝜆ous.



bobua posted:

I've got a SUPER tiny mvc site running locally. Every morning, the first query(entity framework) takes a good 30 seconds to 1 minute, then everything is instant after that. IIS and SQL are on the same server, and the server isn't restarting overnight. Any ideas?

IIS is recycling the app pool. You have to keep it loaded in memory by hitting the site constantly with a script or configure IIS to only recycle if it leaks too much memory.

Potassium Problems
Sep 28, 2001

Munkeymon posted:

IIS is recycling the app pool. You have to keep it loaded in memory by hitting the site constantly with a script or configure IIS to only recycle if it leaks too much memory.

In addition to this, you might want to look at the application initialization module for IIS, which will restart your site after a recycle

Munkeymon
Aug 14, 2003

Motherfucker's got an
armor-piercing crowbar! Rigoddamndicu𝜆ous.



If I'm getting exceptions that look like they come from an async method when I hit a synchronous API endpoint, does that mean something is failing before the actual API method is run? Endpoint looks like

C# code:
        [Route("api/your/mum/authorized/"), HttpPost, HttpGet]
        [AuthenticationFilter(Roles.DO)]
        public AuthorizationCheckResult CheckAuthorization(MumAuthorizationRequest request) {
            if (string.IsNullOrWhiteSpace(request.id) { //this is line 190
//etc
and the error looks like

code:
{
    "Message": "An error has occurred.",
    "ExceptionMessage": "Object reference not set to an instance of an object.",
    "ExceptionType": "System.NullReferenceException",
    "StackTrace": "   at App.Controllers.ApiMumController.CheckAuthorization(MumAuthorizationRequest request) in C:\\agent\\_work\\4\\ApiMumController.cs:line 190
       at lambda_method(Closure , Object , Object[] )
       at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass10.<GetExecutor>b__9(Object instance, Object[] methodParameters)
       at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments)
       at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary`2 arguments, CancellationToken cancellationToken)
       --- End of stack trace from previous location where exception was thrown ---
       at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
       at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
       at System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__0.MoveNext()
       --- End of stack trace from previous location where exception was thrown ---
       at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
       at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
       at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext()
       --- End of stack trace from previous location where exception was thrown ---
       at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
       at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
       at System.Web.Http.Filters.AuthorizationFilterAttribute.<ExecuteAuthorizationFilterAsyncCore>d__2.MoveNext()
       --- End of stack trace from previous location where exception was thrown ---
       at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
       at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
       at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()"
}
The same request works without error on my local machine pointed to the same database as the test server I'm getting the error from, so I'm really scratching my head on this one.

downout
Jul 6, 2009

Munkeymon posted:

If I'm getting exceptions that look like they come from an async method when I hit a synchronous API endpoint, does that mean something is failing before the actual API method is run? Endpoint looks like

C# code:
        [Route("api/your/mum/authorized/"), HttpPost, HttpGet]
        [AuthenticationFilter(Roles.DO)]
        public AuthorizationCheckResult CheckAuthorization(MumAuthorizationRequest request) {
            if (string.IsNullOrWhiteSpace(request.id) { //this is line 190
//etc
and the error looks like

code:
{
    "Message": "An error has occurred.",
    "ExceptionMessage": "Object reference not set to an instance of an object.",
    "ExceptionType": "System.NullReferenceException",
    "StackTrace": "   at App.Controllers.ApiMumController.CheckAuthorization(MumAuthorizationRequest request) in C:\\agent\\_work\\4\\ApiMumController.cs:line 190
       at lambda_method(Closure , Object , Object[] )
       at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass10.<GetExecutor>b__9(Object instance, Object[] methodParameters)
       at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments)
       at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary`2 arguments, CancellationToken cancellationToken)
       --- End of stack trace from previous location where exception was thrown ---
       at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
       at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
       at System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__0.MoveNext()
       --- End of stack trace from previous location where exception was thrown ---
       at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
       at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
       at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext()
       --- End of stack trace from previous location where exception was thrown ---
       at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
       at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
       at System.Web.Http.Filters.AuthorizationFilterAttribute.<ExecuteAuthorizationFilterAsyncCore>d__2.MoveNext()
       --- End of stack trace from previous location where exception was thrown ---
       at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
       at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
       at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()"
}
The same request works without error on my local machine pointed to the same database as the test server I'm getting the error from, so I'm really scratching my head on this one.

Is the 'MumAuthorizationRequest request' object null? The reference to request.id would throw an error if request is null.

EssOEss
Oct 23, 2006
128-bit approved

Munkeymon posted:

If I'm getting exceptions that look like they come from an async method when I hit a synchronous API endpoint, does that mean something is failing before the actual API method is run?

No. It just means your synchronous API was called from some asynchronous code which is perfectly normal. The poster above has the reason for the error.

Munkeymon
Aug 14, 2003

Motherfucker's got an
armor-piercing crowbar! Rigoddamndicu𝜆ous.



downout posted:

Is the 'MumAuthorizationRequest request' object null? The reference to request.id would throw an error if request is null.

That would make perfect sense except that IDK how it could be on one server and not the other, given the same request. IIS settings shouldn't matter by then because the request got all the way into the controller code, so I guess I need to diff my local bin and the deployment directory.

downout
Jul 6, 2009

Munkeymon posted:

That would make perfect sense except that IDK how it could be on one server and not the other, given the same request. IIS settings shouldn't matter by then because the request got all the way into the controller code, so I guess I need to diff my local bin and the deployment directory.

A null check could be done in code before the line. At least that would confirm if it is null, before doing further investigating.

Munkeymon
Aug 14, 2003

Motherfucker's got an
armor-piercing crowbar! Rigoddamndicu𝜆ous.



downout posted:

A null check could be done in code before the line. At least that would confirm if it is null, before doing further investigating.

Yep, I'm sure now that the test server sees a null request object, but I still don't see why. The old test server works as expected and it works when I build locally in test configuration (and gives me the same async-style errors).

I know it wasn't a one-off bad deploy because it built and deployed overnight and it still sees a null object. One wrinkle is that I can't try the new test configuration because I can't get to that database right now because I'm working from home today and permissions are fucky on the new environment I guess, so I'll probably be back tomorrow :angel:

Munkeymon fucked around with this message at 19:27 on Feb 14, 2018

Mr Shiny Pants
Nov 12, 2012
I just wanted to say that C# 7 is pretty cool. The problem is that now I am returning ValueTuples after using F# for awhile......

raminasi
Jan 25, 2005

a last drink with no ice

Mr Shiny Pants posted:

I just wanted to say that C# 7 is pretty cool. The problem is that now I am returning ValueTuples after using F# for awhile......

Why is it a problem?

Night Shade
Jan 13, 2013

Old School

Mr Shiny Pants posted:

I just wanted to say that C# 7 is pretty cool. The problem is that now I am returning ValueTuples after using F# for awhile......

IMO returning tuples is far better than piling on out parameters, though I would probably suggest if you are returning anything wider than a triple you should probably consider creating a struct.

Adbot
ADBOT LOVES YOU

redleader
Aug 18, 2005

Engage according to operational parameters
I'm sad that you need .NET 4.7 to use the new tuple stuff freely. I know there's a Nuget package for ValueTuple, but for ReasonsTM I can't use that, and our servers are still on .NET 4.6.x.

  • 1
  • 2
  • 3
  • 4
  • 5
  • Post
  • Reply