У меня есть метод, который в общем случае десериализует сохраненный объект из предоставленного пользователями пути и типа объекта. Метод работает нормально, за исключением случаев, когда пользователь предоставляет недопустимый путь к файлу. Я хотел бы, чтобы мой метод возвращал null в этом случае, но когда я пытаюсь вернуть null, я получаю ошибку компиляции. Я попытался использовать тип с нулевым значением, но получаю ошибку компиляции. Вместо этого я запускаю объект и возвращаю его, но он вызывает ошибку времени выполнения. Я хотел бы знать, знает ли кто-нибудь правильный способ разрешить возврат null. Код выглядит следующим образом:
public static T RestoreObj<T>(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;
}
}
После рассмотрения комментариев качества Eric Lippert к рассмотрению я пересмотрел метод, чтобы он выглядел так, как вы видите ниже. Преимущество использования "использования" заключается в том, что он автоматически генерирует блок try..finally, который будет вызывать метод dispose (FileStream реализует IDisposable, если это не их ошибка компиляции). Еще одна приятная вещь заключается в том, что брошенное исключение относится к тому, что на самом деле происходит, а не к тому, что у меня выше.
public static T RestoreObj<T>(string datafile)
{
using (var fs = File.OpenRead(datafile))
{
var bf = new BinaryFormatter();
var obj = (T)bf.Deserialize(fs);
return obj;
}
}