title: Return type T can't be returned as null? C# Generics
body: <p>I have a method that generically deserializes a stored object from a users provided filepath and object type. The method works fine, except for when the user provides an invalid filepath. I would like my method to return a null in this case, but when I attempt to return null I get a compilation error. I tried to use a nullable type but get a compilation error. Instead, I typecast an object and return that, but it causes a runtime error. I would like to know if anyone knows the proper way to allow for returning a null. The code is as follows:</p>
  
  <pre><code>        public static T RestoreObj&lt;T&gt;(string datafile)
      {
  
  
          try
          {
              var fs = File.OpenRead(datafile);
              var bf = new BinaryFormatter();
              var obj = (T) bf.Deserialize(fs);
              fs.Close();
              return obj;
          }
          catch (Exception e)
          {
              MessageBox.Show("Could not load. Accepts valid *.dom files only. " + e);
  
              // TODO: how to do this? this will throw a runtime error, and if null returned, a compilation error
              var o = new object();
              return (T) o;
          }
      }
  </code></pre>
  
  <p>After taking Eric Lippert's quality comments in to consideration I revised the method to look like what you see below. The advantage of using 'using' is that it automatically generates a try..finally block that will call the dispose method (FileStream implements IDisposable, if it did not their would be a compile error). Another nice thing is that the exception thrown is relevant to whatever is actually happening instead of what I have above.</p>
  
  <pre><code>        public static T RestoreObj&lt;T&gt;(string datafile) 
      {
          using (var fs = File.OpenRead(datafile))
          {
              var bf = new BinaryFormatter();
              var obj = (T)bf.Deserialize(fs);
              return obj;
          }
      }
  </code></pre>