Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. The Lounge
  3. Another reason I don't like LINQ

Another reason I don't like LINQ

Scheduled Pinned Locked Moved The Lounge
csharplinqdebugginghelpquestion
41 Posts 19 Posters 3 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • H honey the codewitch

    Here's my error

    System.ArgumentNullException: 'Value cannot be null.
    Parameter name: values'

    ... for this mess:

    Columns.AddRange(obj.GetType().GetGenericArguments().FirstOrDefault()?.GetProperties().Where(p =>
    {
    return p.GetCustomAttributes(true).OfType().FirstOrDefault()?.Browsable ?? DefaultBrowsableState;
    }).Select(p =>
    {
    return new ColumnHeader()
    {
    Name = p.Name,
    Text = p.GetCustomAttributes(true).OfType().FirstOrDefault()?.DisplayName ?? p.Name
    };
    }).ToArray());

    The thing is, I know what it's trying to do, and the code makes sense to me even though I didn't write it. The LINQ isn't really that bad here. But the error message is just awful. I don't even know where to begin. Time to hand roll the same statement LINQless so I can debug it. So consider this my part 2 in why LINQ is for the birds.

    Real programmers use butterflies

    M Offline
    M Offline
    Matthew Dennis
    wrote on last edited by
    #13

    I find that adding line breaks makes it a lot easier to read. Remember, you are writing for the next person to touch the code, not the computer. It is missing some Elvis operators, before the Where, the Select, and the ToArray, along with providing a value if the null propagates to the end. Also, you don't need the ToArray() as AddRange takes an IEnumerable<T>.

    Columns
    .AddRange(
    obj.GetType()
    .GetGenericArguments()
    .FirstOrDefault()?.GetProperties()

    // need the Elvis operator 
    ?.Where(p =>
    {
        return p.GetCustomAttributes(true)
                .OfType()
                .FirstOrDefault()?.Browsable ?? DefaultBrowsableState;
    })
    
    // need the Elvis operator 
    ?.Select(p =>
    {
        return new ColumnHeader()
        {
            Name = p.Name,
            Text = p.GetCustomAttributes(true)
                    .OfType().FirstOrDefault()?.DisplayName ?? p.Name
        };
    })
    
    // don't need ToArray(), but need to provide a non-null value for AddRange()
    ?? Array.Empty()
    

    );

    "Time flies like an arrow. Fruit flies like a banana."

    H S Richard DeemingR 3 Replies Last reply
    0
    • H honey the codewitch

      Here's my error

      System.ArgumentNullException: 'Value cannot be null.
      Parameter name: values'

      ... for this mess:

      Columns.AddRange(obj.GetType().GetGenericArguments().FirstOrDefault()?.GetProperties().Where(p =>
      {
      return p.GetCustomAttributes(true).OfType().FirstOrDefault()?.Browsable ?? DefaultBrowsableState;
      }).Select(p =>
      {
      return new ColumnHeader()
      {
      Name = p.Name,
      Text = p.GetCustomAttributes(true).OfType().FirstOrDefault()?.DisplayName ?? p.Name
      };
      }).ToArray());

      The thing is, I know what it's trying to do, and the code makes sense to me even though I didn't write it. The LINQ isn't really that bad here. But the error message is just awful. I don't even know where to begin. Time to hand roll the same statement LINQless so I can debug it. So consider this my part 2 in why LINQ is for the birds.

      Real programmers use butterflies

      M Offline
      M Offline
      Maximilien
      wrote on last edited by
      #14

      I'm not an expert or even a novice ... (serious) Can't you just "unLINQ" this and find and fix the error and LINQ it up again ?

      I'd rather be phishing!

      H 1 Reply Last reply
      0
      • M Maximilien

        I'm not an expert or even a novice ... (serious) Can't you just "unLINQ" this and find and fix the error and LINQ it up again ?

        I'd rather be phishing!

        H Offline
        H Offline
        honey the codewitch
        wrote on last edited by
        #15

        Yes. But that's my point. To get a reasonable error message out of LINQ the solution is do it without LINQ. meh.

        Real programmers use butterflies

        1 Reply Last reply
        0
        • M Matthew Dennis

          I find that adding line breaks makes it a lot easier to read. Remember, you are writing for the next person to touch the code, not the computer. It is missing some Elvis operators, before the Where, the Select, and the ToArray, along with providing a value if the null propagates to the end. Also, you don't need the ToArray() as AddRange takes an IEnumerable<T>.

          Columns
          .AddRange(
          obj.GetType()
          .GetGenericArguments()
          .FirstOrDefault()?.GetProperties()

          // need the Elvis operator 
          ?.Where(p =>
          {
              return p.GetCustomAttributes(true)
                      .OfType()
                      .FirstOrDefault()?.Browsable ?? DefaultBrowsableState;
          })
          
          // need the Elvis operator 
          ?.Select(p =>
          {
              return new ColumnHeader()
              {
                  Name = p.Name,
                  Text = p.GetCustomAttributes(true)
                          .OfType().FirstOrDefault()?.DisplayName ?? p.Name
              };
          })
          
          // don't need ToArray(), but need to provide a non-null value for AddRange()
          ?? Array.Empty()
          

          );

          "Time flies like an arrow. Fruit flies like a banana."

          H Offline
          H Offline
          honey the codewitch
          wrote on last edited by
          #16

          In my defense I didn't write that, nor run it through autoformat yet.

          Real programmers use butterflies

          1 Reply Last reply
          0
          • H honey the codewitch

            Here's my error

            System.ArgumentNullException: 'Value cannot be null.
            Parameter name: values'

            ... for this mess:

            Columns.AddRange(obj.GetType().GetGenericArguments().FirstOrDefault()?.GetProperties().Where(p =>
            {
            return p.GetCustomAttributes(true).OfType().FirstOrDefault()?.Browsable ?? DefaultBrowsableState;
            }).Select(p =>
            {
            return new ColumnHeader()
            {
            Name = p.Name,
            Text = p.GetCustomAttributes(true).OfType().FirstOrDefault()?.DisplayName ?? p.Name
            };
            }).ToArray());

            The thing is, I know what it's trying to do, and the code makes sense to me even though I didn't write it. The LINQ isn't really that bad here. But the error message is just awful. I don't even know where to begin. Time to hand roll the same statement LINQless so I can debug it. So consider this my part 2 in why LINQ is for the birds.

            Real programmers use butterflies

            F Offline
            F Offline
            F ES Sitecore
            wrote on last edited by
            #17

            It's not really LINQ's fault, it's the chaining of multiple commands into a single statement and also a little of your own inexperience; given that error message many would know exactly where to look.

            1 Reply Last reply
            0
            • H honey the codewitch

              Here's my error

              System.ArgumentNullException: 'Value cannot be null.
              Parameter name: values'

              ... for this mess:

              Columns.AddRange(obj.GetType().GetGenericArguments().FirstOrDefault()?.GetProperties().Where(p =>
              {
              return p.GetCustomAttributes(true).OfType().FirstOrDefault()?.Browsable ?? DefaultBrowsableState;
              }).Select(p =>
              {
              return new ColumnHeader()
              {
              Name = p.Name,
              Text = p.GetCustomAttributes(true).OfType().FirstOrDefault()?.DisplayName ?? p.Name
              };
              }).ToArray());

              The thing is, I know what it's trying to do, and the code makes sense to me even though I didn't write it. The LINQ isn't really that bad here. But the error message is just awful. I don't even know where to begin. Time to hand roll the same statement LINQless so I can debug it. So consider this my part 2 in why LINQ is for the birds.

              Real programmers use butterflies

              R Offline
              R Offline
              Ryan Peden
              wrote on last edited by
              #18

              A couple of possibly interesting bits of feedback, assuming that code comes from here: - Adding it to a WinForms app created with .NET Core 3.1 or .NET 5 and turning on nullable reference types finds 17 potential accidental nulls in the code from that SO post. But the Columns.AddRange call itself isn't one of them because WinForms wasn't built with NRT enabled. So the compiler decides it can't say one way or another if passing a null values argument to AddRange is okay. - Resharper catches the potential error whether you're using .NET Core/.NET 5 or .NET Framework. It even suggests a fix. The static analysis it's doing must look at AddRange and notice that the first thing that method does is throw an exception if values is null.

              S J Richard DeemingR H 4 Replies Last reply
              0
              • M Matthew Dennis

                I find that adding line breaks makes it a lot easier to read. Remember, you are writing for the next person to touch the code, not the computer. It is missing some Elvis operators, before the Where, the Select, and the ToArray, along with providing a value if the null propagates to the end. Also, you don't need the ToArray() as AddRange takes an IEnumerable<T>.

                Columns
                .AddRange(
                obj.GetType()
                .GetGenericArguments()
                .FirstOrDefault()?.GetProperties()

                // need the Elvis operator 
                ?.Where(p =>
                {
                    return p.GetCustomAttributes(true)
                            .OfType()
                            .FirstOrDefault()?.Browsable ?? DefaultBrowsableState;
                })
                
                // need the Elvis operator 
                ?.Select(p =>
                {
                    return new ColumnHeader()
                    {
                        Name = p.Name,
                        Text = p.GetCustomAttributes(true)
                                .OfType().FirstOrDefault()?.DisplayName ?? p.Name
                    };
                })
                
                // don't need ToArray(), but need to provide a non-null value for AddRange()
                ?? Array.Empty()
                

                );

                "Time flies like an arrow. Fruit flies like a banana."

                S Offline
                S Offline
                Slacker007
                wrote on last edited by
                #19

                Matthew Dennis wrote:

                I find that adding line breaks makes it a lot easier to read

                :thumbsup:

                1 Reply Last reply
                0
                • R Ryan Peden

                  A couple of possibly interesting bits of feedback, assuming that code comes from here: - Adding it to a WinForms app created with .NET Core 3.1 or .NET 5 and turning on nullable reference types finds 17 potential accidental nulls in the code from that SO post. But the Columns.AddRange call itself isn't one of them because WinForms wasn't built with NRT enabled. So the compiler decides it can't say one way or another if passing a null values argument to AddRange is okay. - Resharper catches the potential error whether you're using .NET Core/.NET 5 or .NET Framework. It even suggests a fix. The static analysis it's doing must look at AddRange and notice that the first thing that method does is throw an exception if values is null.

                  S Offline
                  S Offline
                  Slacker007
                  wrote on last edited by
                  #20

                  Ryan Peden wrote:

                  Resharper catches the potential error

                  Ryan Peden wrote:

                  It even suggests a fix.

                  :thumbsup:

                  1 Reply Last reply
                  0
                  • H honey the codewitch

                    There's a pretty large gulf between not liking something and hating it. If I don't like it, it just means I'll avoid using it, and sometimes complain about it. If I hated it I'd probably actively seek to destroy it somehow, and that would be a fight with Microsoft I'd rather not invest in, especially since it's one I couldn't win.

                    Real programmers use butterflies

                    J Offline
                    J Offline
                    Jorgen Andersson
                    wrote on last edited by
                    #21

                    Every technology has its place, For simple filtering and selection Linq is quite fine. But for this I would have used other techniques. (Admittedly mixed with linq)

                    Wrong is evil and must be defeated. - Jeff Ello

                    1 Reply Last reply
                    0
                    • R Ryan Peden

                      A couple of possibly interesting bits of feedback, assuming that code comes from here: - Adding it to a WinForms app created with .NET Core 3.1 or .NET 5 and turning on nullable reference types finds 17 potential accidental nulls in the code from that SO post. But the Columns.AddRange call itself isn't one of them because WinForms wasn't built with NRT enabled. So the compiler decides it can't say one way or another if passing a null values argument to AddRange is okay. - Resharper catches the potential error whether you're using .NET Core/.NET 5 or .NET Framework. It even suggests a fix. The static analysis it's doing must look at AddRange and notice that the first thing that method does is throw an exception if values is null.

                      J Offline
                      J Offline
                      Jorgen Andersson
                      wrote on last edited by
                      #22

                      Sounds like nullable reference types is reason enough in itself to upgrade to .Net 5.

                      Wrong is evil and must be defeated. - Jeff Ello

                      1 Reply Last reply
                      0
                      • H honey the codewitch

                        Yeah I sorted it out. It was being applied to an instance of the wrong class. The code that's using it is ridiculously complicated, and something small was out of place. This error was the end result. I still think it's suitable for the purposes of this rant. :) Such is life sometimes. I'm working with lots of Other People's Code(TM) at the moment. It's not so much that any one of them is particularly bad, so much as gluing together so many different paradigms is well.. as you can expect. But the main complication of it all is making it designable so my client can open it up in visual studio and tweak it, because he likes to be able to. He can code some, but I'd prefer he keep his mitts off what i write. I can deal with him using the designer. It works for both of us because he's afraid of my code anyway, and that way he doesn't have to bug me for little changes, but sometimes the code to make it all go properly is nasty.

                        Real programmers use butterflies

                        Sander RosselS Online
                        Sander RosselS Online
                        Sander Rossel
                        wrote on last edited by
                        #23

                        All this complaining about LINQ and AddRange, a non-LINQ function, was the problem? :laugh: Nothing a good old stack trace couldn't have pointed out by the way :zzz:

                        Best, Sander Azure DevOps Succinctly (free eBook) Azure Serverless Succinctly (free eBook) Migrating Apps to the Cloud with Azure arrgh.js - Bringing LINQ to JavaScript

                        1 Reply Last reply
                        0
                        • H honey the codewitch

                          Here's my error

                          System.ArgumentNullException: 'Value cannot be null.
                          Parameter name: values'

                          ... for this mess:

                          Columns.AddRange(obj.GetType().GetGenericArguments().FirstOrDefault()?.GetProperties().Where(p =>
                          {
                          return p.GetCustomAttributes(true).OfType().FirstOrDefault()?.Browsable ?? DefaultBrowsableState;
                          }).Select(p =>
                          {
                          return new ColumnHeader()
                          {
                          Name = p.Name,
                          Text = p.GetCustomAttributes(true).OfType().FirstOrDefault()?.DisplayName ?? p.Name
                          };
                          }).ToArray());

                          The thing is, I know what it's trying to do, and the code makes sense to me even though I didn't write it. The LINQ isn't really that bad here. But the error message is just awful. I don't even know where to begin. Time to hand roll the same statement LINQless so I can debug it. So consider this my part 2 in why LINQ is for the birds.

                          Real programmers use butterflies

                          R Offline
                          R Offline
                          raddevus
                          wrote on last edited by
                          #24

                          The main challenge of LINQ that you don't like (I believe) is one that is quite difficult to accept (for me too) and for many of us who originally learned imperative programming. The main challenge is that LINQ is a declarative construct within an imperative programming language. You probably know this already. Declarative languages expect you to tell them what you want (not how they should do it). However, how they actually get you want you want is hidden (black box). So when they fail, it is quite difficult to know where / why they failed. With imperative programming you have written the steps to get the thing to do the thing and you know where the problem is. Squirrel From A Different Dimension This may not help but it'll help you understand that even though the animal you are wrestling with looks very much like a normal squirrel, it is actually a squirrel that lives in another dimension and it behaves quite differently. :laugh:

                          1 Reply Last reply
                          0
                          • H honey the codewitch

                            Here's my error

                            System.ArgumentNullException: 'Value cannot be null.
                            Parameter name: values'

                            ... for this mess:

                            Columns.AddRange(obj.GetType().GetGenericArguments().FirstOrDefault()?.GetProperties().Where(p =>
                            {
                            return p.GetCustomAttributes(true).OfType().FirstOrDefault()?.Browsable ?? DefaultBrowsableState;
                            }).Select(p =>
                            {
                            return new ColumnHeader()
                            {
                            Name = p.Name,
                            Text = p.GetCustomAttributes(true).OfType().FirstOrDefault()?.DisplayName ?? p.Name
                            };
                            }).ToArray());

                            The thing is, I know what it's trying to do, and the code makes sense to me even though I didn't write it. The LINQ isn't really that bad here. But the error message is just awful. I don't even know where to begin. Time to hand roll the same statement LINQless so I can debug it. So consider this my part 2 in why LINQ is for the birds.

                            Real programmers use butterflies

                            M Offline
                            M Offline
                            Marc Clifton
                            wrote on last edited by
                            #25

                            p.GetCustomAttributes(true).OfType()

                            I believe OfType<>() is returning a null.

                            honey the codewitch wrote:

                            The LINQ isn't really that bad here.

                            Actually, it's rather horrific. Not to mention what looks like completely unnecessary and probably wrong FirstOrDefault() usage, the reflection usage which looks like it could be simplified, and other confusing things. And the probably useless ToArray().

                            honey the codewitch wrote:

                            even though I didn't write it

                            Whew! ;)

                            Latest Articles:
                            Client-Side Type-Based Publisher/Subscriber, Exploring Synchronous, "Event-ed", and Worker Thread Subscriptions

                            Richard DeemingR 1 Reply Last reply
                            0
                            • O obermd

                              The underlying issue is that this garbage is a "one-liner". One-liners are darn near impossible to debug. LinQ invites, and even encourages this crap into the code.

                              M Offline
                              M Offline
                              Marc Clifton
                              wrote on last edited by
                              #26

                              And Linq combined with extension methods makes one-liners even more fun! I write them frequently! :laugh:

                              Latest Articles:
                              Client-Side Type-Based Publisher/Subscriber, Exploring Synchronous, "Event-ed", and Worker Thread Subscriptions

                              1 Reply Last reply
                              0
                              • H honey the codewitch

                                Here's my error

                                System.ArgumentNullException: 'Value cannot be null.
                                Parameter name: values'

                                ... for this mess:

                                Columns.AddRange(obj.GetType().GetGenericArguments().FirstOrDefault()?.GetProperties().Where(p =>
                                {
                                return p.GetCustomAttributes(true).OfType().FirstOrDefault()?.Browsable ?? DefaultBrowsableState;
                                }).Select(p =>
                                {
                                return new ColumnHeader()
                                {
                                Name = p.Name,
                                Text = p.GetCustomAttributes(true).OfType().FirstOrDefault()?.DisplayName ?? p.Name
                                };
                                }).ToArray());

                                The thing is, I know what it's trying to do, and the code makes sense to me even though I didn't write it. The LINQ isn't really that bad here. But the error message is just awful. I don't even know where to begin. Time to hand roll the same statement LINQless so I can debug it. So consider this my part 2 in why LINQ is for the birds.

                                Real programmers use butterflies

                                G Offline
                                G Offline
                                Gary R Wheeler
                                wrote on last edited by
                                #27

                                Yet another example of the school of thought that replacing if, for, and while by declarative constructs results in code that is simplicity itself to read, robust, and completely error free. In a pig's eye.

                                Software Zen: delete this;

                                1 Reply Last reply
                                0
                                • H honey the codewitch

                                  Here's my error

                                  System.ArgumentNullException: 'Value cannot be null.
                                  Parameter name: values'

                                  ... for this mess:

                                  Columns.AddRange(obj.GetType().GetGenericArguments().FirstOrDefault()?.GetProperties().Where(p =>
                                  {
                                  return p.GetCustomAttributes(true).OfType().FirstOrDefault()?.Browsable ?? DefaultBrowsableState;
                                  }).Select(p =>
                                  {
                                  return new ColumnHeader()
                                  {
                                  Name = p.Name,
                                  Text = p.GetCustomAttributes(true).OfType().FirstOrDefault()?.DisplayName ?? p.Name
                                  };
                                  }).ToArray());

                                  The thing is, I know what it's trying to do, and the code makes sense to me even though I didn't write it. The LINQ isn't really that bad here. But the error message is just awful. I don't even know where to begin. Time to hand roll the same statement LINQless so I can debug it. So consider this my part 2 in why LINQ is for the birds.

                                  Real programmers use butterflies

                                  S Offline
                                  S Offline
                                  Super Lloyd
                                  wrote on last edited by
                                  #28

                                  Exception that leaves you clueless.. yes, it happens :/ The null reference exception is a big culprit with those.. :/ However, I dare say that (perhaps) Stacktrace could help provide a bit more helpful insight here?!

                                  A new .NET Serializer All in one Menu-Ribbon Bar Taking over the world since 1371!

                                  H 1 Reply Last reply
                                  0
                                  • S Super Lloyd

                                    Exception that leaves you clueless.. yes, it happens :/ The null reference exception is a big culprit with those.. :/ However, I dare say that (perhaps) Stacktrace could help provide a bit more helpful insight here?!

                                    A new .NET Serializer All in one Menu-Ribbon Bar Taking over the world since 1371!

                                    H Offline
                                    H Offline
                                    honey the codewitch
                                    wrote on last edited by
                                    #29

                                    I mean, yes. eventually. but it (as someone mentioned earlier but I forget who) reminds me of C++ template exceptions. The code and the exception couldn't seem more unrelated on the surface, and code that isn't communicative at face value is problematic, which is basically my point here. I have the same complaint about C++ templates and generic programming despite being in love with GP. I guess for me the power of GP outweighs the incomprehensibility of it but I just don't feel that way with LINQ.

                                    Real programmers use butterflies

                                    Richard DeemingR 1 Reply Last reply
                                    0
                                    • H honey the codewitch

                                      Here's my error

                                      System.ArgumentNullException: 'Value cannot be null.
                                      Parameter name: values'

                                      ... for this mess:

                                      Columns.AddRange(obj.GetType().GetGenericArguments().FirstOrDefault()?.GetProperties().Where(p =>
                                      {
                                      return p.GetCustomAttributes(true).OfType().FirstOrDefault()?.Browsable ?? DefaultBrowsableState;
                                      }).Select(p =>
                                      {
                                      return new ColumnHeader()
                                      {
                                      Name = p.Name,
                                      Text = p.GetCustomAttributes(true).OfType().FirstOrDefault()?.DisplayName ?? p.Name
                                      };
                                      }).ToArray());

                                      The thing is, I know what it's trying to do, and the code makes sense to me even though I didn't write it. The LINQ isn't really that bad here. But the error message is just awful. I don't even know where to begin. Time to hand roll the same statement LINQless so I can debug it. So consider this my part 2 in why LINQ is for the birds.

                                      Real programmers use butterflies

                                      C Offline
                                      C Offline
                                      charlieg
                                      wrote on last edited by
                                      #30

                                      is that custom generated? because if you had to write that -"their's your sign"

                                      Charlie Gilley <italic>Stuck in a dysfunctional matrix from which I must escape... "Where liberty dwells, there is my country." B. Franklin, 1783 “They who can give up essential liberty to obtain a little temporary safety deserve neither liberty nor safety.” BF, 1759

                                      1 Reply Last reply
                                      0
                                      • M Matthew Dennis

                                        I find that adding line breaks makes it a lot easier to read. Remember, you are writing for the next person to touch the code, not the computer. It is missing some Elvis operators, before the Where, the Select, and the ToArray, along with providing a value if the null propagates to the end. Also, you don't need the ToArray() as AddRange takes an IEnumerable<T>.

                                        Columns
                                        .AddRange(
                                        obj.GetType()
                                        .GetGenericArguments()
                                        .FirstOrDefault()?.GetProperties()

                                        // need the Elvis operator 
                                        ?.Where(p =>
                                        {
                                            return p.GetCustomAttributes(true)
                                                    .OfType()
                                                    .FirstOrDefault()?.Browsable ?? DefaultBrowsableState;
                                        })
                                        
                                        // need the Elvis operator 
                                        ?.Select(p =>
                                        {
                                            return new ColumnHeader()
                                            {
                                                Name = p.Name,
                                                Text = p.GetCustomAttributes(true)
                                                        .OfType().FirstOrDefault()?.DisplayName ?? p.Name
                                            };
                                        })
                                        
                                        // don't need ToArray(), but need to provide a non-null value for AddRange()
                                        ?? Array.Empty()
                                        

                                        );

                                        "Time flies like an arrow. Fruit flies like a banana."

                                        Richard DeemingR Offline
                                        Richard DeemingR Offline
                                        Richard Deeming
                                        wrote on last edited by
                                        #31

                                        Matthew Dennis wrote:

                                        It is missing some Elvis operators

                                        It's not. If the FirstOrDefault returns null, the GetProperties and subsequent calls won't execute. If it returns non-null, GetProperties will never return null:

                                        Type.GetProperties Method (System) | Microsoft Docs[^]:

                                        Returns An array of PropertyInfo objects representing all public properties of the current Type. -or- An empty array of type PropertyInfo, if the current Type does not have public properties.

                                        Similarly, Where will never return null. If the input sequence is null, it will throw an exception. If the input sequence is empty, or there are no matching elements, it will return an empty sequence. And the same applies to Select - it will either throw an exception, or return a non-null sequence.


                                        "These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer

                                        "These people looked deep within my soul and assigned me a number based on the order in which I joined" - Homer

                                        M 1 Reply Last reply
                                        0
                                        • R Ryan Peden

                                          A couple of possibly interesting bits of feedback, assuming that code comes from here: - Adding it to a WinForms app created with .NET Core 3.1 or .NET 5 and turning on nullable reference types finds 17 potential accidental nulls in the code from that SO post. But the Columns.AddRange call itself isn't one of them because WinForms wasn't built with NRT enabled. So the compiler decides it can't say one way or another if passing a null values argument to AddRange is okay. - Resharper catches the potential error whether you're using .NET Core/.NET 5 or .NET Framework. It even suggests a fix. The static analysis it's doing must look at AddRange and notice that the first thing that method does is throw an exception if values is null.

                                          Richard DeemingR Offline
                                          Richard DeemingR Offline
                                          Richard Deeming
                                          wrote on last edited by
                                          #32

                                          Ryan Peden wrote:

                                          The static analysis it's doing must look at AddRange and notice that the first thing that method does is throw an exception if values is null.

                                          I suspect it's more likely that it has "external annotations" for the type in question. External Annotations—ReSharper[^] R# is already slow enough; if it had to do static analysis on every framework method you called, it would be completely unusable. :)


                                          "These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer

                                          "These people looked deep within my soul and assigned me a number based on the order in which I joined" - Homer

                                          1 Reply Last reply
                                          0
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          • Login

                                          • Don't have an account? Register

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • World
                                          • Users
                                          • Groups