c# - 返回类型 T 不能返回为 null? C#泛型

标签 c# generics nullable

我有一个方法可以从用户提供的文件路径和对象类型中反序列化存储的对象。该方法工作正常,除非用户提供了无效的文件路径。在这种情况下,我希望我的方法返回 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/

相关文章:

VB.NET - 想要将两个可空类型加在一起 ​​- 如何? (即 var1 + var2 两者都可以为 null 并且 vari1=Nothing,Var2=5 结果为 Nothing)

c# - 通用方法设置基类属性的值

c# - WPF。在没有 ItemsSource 的 ListBox 中对项目进行分组

c# - 检查数据库中的重复数据 (C#)

c# - 在 C# 中使用 Socket 改进 TCP 转发器

c# - 通用 ServerControl 语法?

c# 泛型无法将源类型转换为目标类型

c# - T?,C# 9 中的可为空类型参数

c# - 将类型参数的实例与 null 进行比较,即使没有类约束?

c# - 从 TreeView 检索节点上的绑定(bind)对象