如何覆盖默认值(int?)以获取NULL而不是0

5
我在这里找到了一个方法:链接
public static T GetValue<T>(object value)
{
    if (value == null || value == DBNull.Value)
        return default(T);
    else
        return (T)value;
}

如果“value”为NULL,如何重写以获取NULL?

5个回答

11

你不需要重写它。你只需要这样调用它:

GetValue<int?>(value);

5

int 是一个值类型而不是引用类型 - 它不能有 null 的值。

如果你的数据库中的 INT 列可以为 null,请考虑使用 int? 代替。


5
如何重写它以便在"value"为空时获得null?
你不能这样做 - int类型不能为null。但是,您可以使用Nullable代替。但这只适用于值类型。例如,对于T == string,它将不再起作用。为了实现这一点,您需要编写两个不同的函数,一个用于可空值类型,另一个用于引用类型。
public T? GetValue<T>(object value) where T : struct
{
    if (value == null || value == DBNull.Value)
        return null;
    else
        return (T?)value;
}

Or, terser:

public T? GetValue<T>(object value) where T : struct
{
    return (value == null value == DBNull.Value) ? null : (T?)value;
}

在所有情况下,T?Nullable<T>的快捷方式。

-1- 上面的代码对于引用类型无法工作 - 你不能有 Nullable<string>。只需使用 int? 作为 T 调用原始方法即可。 - Jakub Konecki
@Konrad - 但这将限制此通用函数仅适用于值类型 - 你见过没有字符串的数据库吗?;-) - Jakub Konecki
@Jakub 别问我 - 我只会使用现有的数据库抽象层,然后就完成了。 - Konrad Rudolph
@Konrad - 抱歉,我完全不理解你的回答 - 你建议所有表示表格的域对象(这段代码可能用于从数据库读取器中填充对象)只能使用可空值类型。这是一个很大的限制,我猜想这并不是一个理想的选择。 - Jakub Konecki
@Jakub 不是这个意思。我建议使用两个不同的函数来处理不兼容的类型类(值类型和引用类型),或者采用 @degorolls 的方法(即不更改函数)。 - Konrad Rudolph

0
在C#中,int是值类型,因此像Jakub所说的那样,它不能为null。但是,您可以定义一个变量:
int? thisValue;

这可以被设置为 null。


0

您是指这个吗:

public T GetValue<T>(object value){
    if (value == null)
        return null;
    else if (value == DBNull.Value)
        return default(T);
    else
        return (T)value;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接