如何从C#中的通用方法返回NULL?

这篇博客讨论了在C#中遇到的通用方法返回NULL时的编译错误,并提供了多种解决方案。其中包括使用default(T)、类型约束、调整泛型声明以及针对可为空类型的处理。社区成员给出了不同角度的建议,如使用Nullable约束、输出参数等,帮助解决问题。
摘要由CSDN通过智能技术生成

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

static T FindThing<T>(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楼

  1. 如果您有对象,则需要打字

     return (T)(object)(employee); 
  2. 如果需要返回null。

     return default(T); 

#2楼

这是Nullable Enum返回值的工作示例:

public static TEnum? ParseOptional<TEnum>(this string value) where TEnum : struct
{
    return value == null ? (TEnum?)null : (TEnum) Enum.Parse(typeof(TEnum), value);
}

#3楼

return default(T);

#4楼

根据错误的建议...以及用户default(T)new T

您必须在代码中添加一个比较,以确保沿着该路线进行匹配是有效的。

否则,可能考虑将输出参数用于“找到匹配项”。


#5楼

两种选择:

  • 返回default(T)其意味着你将返回null如果T是引用类型(或空值类型), 0int'\\0'char等。( 默认值表(C#参考)
  • 使用where T : class约束将where T : class限制为引用类型,然后正常返回null

#6楼

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

    where T : class
    where T: IList

这样,它将允许您返回null。


#7楼

您可以调整约束:

where T : class

然后允许返回null。


#8楼

将类约束作为第一个约束添加到泛型类型。

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

#9楼

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

return default(T);

要么

where T : class, IThing
 return null;

#10楼

上述2个答案的另一种选择。 如果将返回类型更改为object ,则可以返回null ,同时强制转换非null返回值。

static object FindThing<T>(IList collection, int id)
{
    foreach T thing in collecion
    {
        if (thing.Id == id)
            return (T) thing;
    }
    return null;  // allowed now
}

#11楼

TheSoftwareJedi的解决方案,

您也可以使用几个值和可为空的类型将其归档:

static T? FindThing<T>(IList collection, int id) where T : struct, IThing
{
    foreach T thing in collecion
    {
        if (thing.Id == id)
            return thing;
    }
    return null;
}
### 回答1: C# null coalescing 操作符(??)用于检查一个值是否为 null,如果是,则返回默认值;否则返回该值本身。它的语法为: ``` value = expression1 ?? expression2; ``` 其,如果 expression1 不为 null,则 value 等于 expression1;否则 value 等于 expression2。 例如,假设有如下代码: ``` string str1 = null; string str2 = "hello"; string str3 = str1 ?? str2; ``` 则 str3 的值为 "hello",因为 str1 为 null,而 str2 不为 null。如果 str1 不为 null,则 str3 的值就是 str1 的值。 ### 回答2: c是英文字母表的第三个字母,也是拉丁字母表的一个字母。在英语,它通常发音为/k/音。在,c通常用作外来词的一个拼音字母,表示/k/的发音。例如,国人将"Coca-Cola"音译为"可口可乐"。 此外,C也是数学常见的符号之一。它可以代表圆的周长、复数的虚数单位以及某些曲线的常数。在计算机科学,C是一种编程语言的名称,它是一种通用的高级编程语言,广泛应用于软件开发领域。 "c"还可以表示一些其他的词,如"Celsius"(摄氏度)、"century"(世纪)和"car"(汽车)等。在音乐,C代表一个音,具体的音高取决于所用的调音系统。 总而言之,c是一个常见的字母,它在不同的领域有着不同的用途和含义。无论是作为字母表的一个字母还是作为一种编程语言的名称,c都在人类的日常生活起着重要的作用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值