【问题标题】:Why can't I cast generic-type with null? [duplicate]为什么我不能将泛型类型转换为 null? [复制]
【发布时间】:2023-03-12 01:52:02
【问题描述】:

一个similar question,但没有转换 T 参数。

这不起作用

public T GetValueG<T>(string Query)
{
    object value = DBNull.Value;    // Read from Database which can return DBNull
    if (value is DBNull)
        return (T)null;
    else
        return (T)value;
}

错误 CS0037 无法将 null 转换为 'T',因为它是不可为空的值类型


但这行得通

public T GetValueG<T>(string Query)
{
    object value = DBNull.Value;    // Read from Database which can return DBNull
    if (value is DBNull)
        value = null;

    return (T)value;
}

我知道使用约束类型 where T: struct 将使 T 能够直接使用 null 进行强制转换。

但是在第二种方法中,为什么它接受一个 100% 可以为空的对象?为什么我不能不带对象或其他东西直接返回null?

【问题讨论】:

  • 你为什么要首先做(T)null?返回 default(T) 或返回 null。
  • default(T) 整数和小数返回零。我不需要那个.. 如果它不是可以为空的泛型类型,geenric-type 也不能返回 null。我想为任何数据库阅读器接受 null 。不是默认值。
  • 我同意,在这种情况下,返回 default(T) 可能是最好的选择,但不知道为什么需要专门为 null 的更多细节。
  • Matt U 和 Adriani6,伙计们,我不想默认类型。我总是为 DBNulls 返回 null。就这样 ! :)
  • @deveton 但是您不能将 null 分配给整数.. 除非它是一个可为空的整数.. GetValueG&lt;int?&gt;() 然后将 default(T) 作为您的回报。事实上,将泛型类型设置为 int? bool? 等就足以返回 null 而无需强制转换 - 但这显然会留下一个可能的异常。

标签: c# .net generics null nullable


【解决方案1】:

您尝试做的事情是错误的。整数是不可为空的类型,这意味着您不能将 null 作为 int 的值或任何其他不可为空的类型返回(顾名思义......)

举个例子:

int myInt = null; - 您的 IDE 将立即将其标记为整数是不可为空的类型。

您想要做的是使用您尝试使用的实际类型的可为空类型,例如int?bool?

您应该返回 nulldefault(T) 而不是 (T)null 这没有意义,因为您不能将 null 转换为例如一个类类型,它会抛出Object Reference Not Set To An Instance...

我会将您的功能更改为以下内容:

public T GetValueG<T>(string Query)
{

    object value = DBNull.Value;    // Read from Database which can return DBNull
    if (value is DBNull)
        return default(T);  // `return default;` also valid since C# 7.1 

    return (T)value;
}

如果您的数据库中的值可以为空,那么您的模型应该实现该类型的可空值,以避免稍后抛出异常。

你的函数应该被称为GetValueG&lt;int?&gt;("&lt;query&gt;");

不可为空的默认值可以在here找到。

在您的代码中,与其使用myInt == null 检查空值,不如使用myNullableInt.HasValue

总结

默认关键字。默认情况下将为可为空的类型返回 null。 以及其他不可为空的类型的默认值。根据 OP 的需要。

default(bool?) -> 空

default(bool) -> 错误

【讨论】:

  • 哦,我从没想过 default(bool?) 会返回 null。所以是的,你的方法是一个很好的方法。对于可空和不可空类型,使用默认值是必须的。我将修改一些内容以使其更简洁。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-10
  • 2011-12-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多