当前位置:  开发笔记 > 编程语言 > 正文

如何从C#中的泛型方法返回NULL?

如何解决《如何从C#中的泛型方法返回NULL?》经验,为你挑选了7个好方法。

我有一个通用的方法与这个(虚拟)代码(是的我知道IList有谓词,但我的代码不使用IList但其他一些集合,无论如何这与问题无关...)

static T FindThing(IList collection, int id) where T : IThing, new()
{
    foreach T thing in collecion
    {
        if (thing.Id == id)
            return thing;
    }
    return null;  // ERROR: Cannot convert null to type parameter 'T' because it could be a value type. Consider using 'default(T)' instead.
}

这给了我一个构建错误

"无法将null转换为类型参数'T',因为它可能是值类型.请考虑使用'default(T)'."

我可以避免这个错误吗?



1> Jon Skeet..:

两种选择:

返回default(T)表示null如果T是引用类型(或可空值类型),0for int,'\0'for char等,则返回(默认值表(C#Reference))

将T限制为具有where T : class约束的引用类型,然后null正常返回


我认为这个问题是如果你使用这个泛型方法说,将数据库对象从DbNull转换为Int并返回默认值(T),其中T是一个int,它将返回0.如果这个数字是实际上是有意义的,那么在该字段为空的情况下,您将传递坏数据.或者更好的例子是DateTime.如果该字段类似于"DateClosed"并且它返回为null,因为并且帐户仍处于打开状态,它实际上默认(DateTime)为1/1/0000,这意味着该帐户在计算机发明之前已关闭.
@Sinaesthetic:所以你要转换为`Nullable `或`Nullable `.如果您使用非可空类型并且需要表示空值,那么您只是在寻找麻烦.
如果我的返回类型是枚举而不是类,该怎么办?我不能指定T:enum :(

2> Ricardo Vill..:
return default(T);



3> TheSoftwareJ..:

你可以调整你的约束:

where T : class

然后返回null是允许的.



4> Min..:

将类约束添加为泛型类型的第一个约束.

static T FindThing(IList collection, int id) where T : class, IThing, new()



5> 小智..:

    如果你有对象则需要进行类型转换

    return (T)(object)(employee);
    

    如果你需要返回null.

    return default(T);
    



6> Jaydeep Shil..:

以下是您可以使用的两个选项

return default(T);

要么

where T : class, IThing
 return null;



7> BFree..:

您的另一个选择是将此添加到您的声明的末尾:

    where T : class
    where T: IList

这样它将允许您返回null.

推荐阅读
TXCWB_523
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有