I have a static readonly collection of user defined object type which is initialized like below.
private static readonly List<MyClass> obj = new List<MyClass>();
Another public utility method fills this collection and return the collection back.
public static List<MyClass> GetMyClasses(){
// some code for DB calls goes here
// in a loop based on recordset, i fill the collection like below
obj.Add(new MyClass(){// my class property settings based on DB values});
// finally return the collection
return obj;
}
I am getting the 'object refrence not set to an instance of an object' on 'ac' object in below line.
var cl = TestClass.GetMyClasses().FirstOrDefault(ac => ac.name == "myname")
I would like to know why 'ac' object is NULL here, even if we the collection is empty, as per MSDN FirstOrDefault should return NULL for reference types if it does't find the match.
Can somebody help me understand what i am missing here? The same code was working flawlessly for months before it started throwing exception today. The same code is working well even today on other server without issues.
For security reasons i can't post the entire exception stack trace but, it is pointing to below IL code
at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source, Func`2 predicate)
Updating the question with sample similar code of the issue.
public static class DemoDataAccess
{
private static readonly List<MyTestClass> classes
= new List<MyTestClass>();
public static IList<MyTestClass> GetMyClasses()
{
using (var cnn = new SqlConnection(@"connection string goes here"))
{
cnn.Open();
using (var cmd = new SqlCommand("SP Name", cnn))
{
cmd.CommandType = CommandType.StoredProcedure;
using (SqlDataReader rdr = cmd.ExecuteReader())
{
while (rdr.Read())
{
classes.Add(new MyTestClass()
{
Id = Convert.ToInt32(rdr["id"]),
Name = Convert.ToString(rdr["name"])
});
}
}
}
}
return classes;
}
}
public class MyTestClass
{
public int Id { get; set; }
public string Name { get; set; }
}
Consistenly exception is thrown on below line and stack trace is point to 'ac' instance.
var obj = DemoDataAccess
.GetMyClasses()
.FirstOrDefault(ac => ac.Name == "something");