我有一个方法可以从用户提供的文件路径和对象类型中反序列化存储的对象。该方法工作正常,除非用户提供了无效的文件路径。在这种情况下,我希望我的方法返回 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 的质量评论后,我修改了方法,使其看起来像您在下面看到的那样。使用 'using' 的优点是它会自动生成一个 try..finally block ,该 block 将调用 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;
}
}
最佳答案
如果您只打算使用类,则添加 where T : class
约束:
public static T RestoreObj<T>(string datafile) where T : class
如果您希望反序列化结构,那么只需返回 default(T)
.那将是 null
对于引用类型,默认值(通常为 0)对于结构。正如@JMH 指出的那样,default(Nullable<T>)
是 null
-包含可为空。
关于c# - 返回类型 T 不能返回为 null? C#泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7340379/