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

时间:2008-11-19 14:51:42

标签: c# generics

我有这个(虚拟)代码的通用方法(是的我知道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)'。

我可以避免此错误吗?

13 个答案:

答案 0 :(得分:865)

两个选项:

  • 返回default(T),这意味着如果T是引用类型(或可空值类型),null 0int,{}返回'\0'char } where T : class等等(Default values table (C# Reference)
  • 将T限制为具有null约束的引用类型,然后正常返回{{1}}

答案 1 :(得分:77)

return default(T);

答案 2 :(得分:29)

您可以调整约束条件:

where T : class

然后允许返回null。

答案 3 :(得分:11)

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

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

答案 4 :(得分:6)

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

    where T : class
    where T: IList

这样它就可以让你返回null。

答案 5 :(得分:6)

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

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

    return default(T);
    

答案 6 :(得分:5)

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

return default(T);

where T : class, IThing
 return null;

答案 7 :(得分:3)

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;
}

答案 8 :(得分:2)

出于完整性考虑,很高兴知道您也可以这样做:

return default;

它返回与return default(T);

相同的结果

答案 9 :(得分:1)

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

您必须在代码中添加一个比较,以确保在您走这条路线时它是一个有效的匹配。

否则,可能会考虑“匹配找到”的输出参数。

答案 10 :(得分:1)

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

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

答案 11 :(得分:0)

上述2个答案的另一种选择。如果将返回类型更改为object,则可以返回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
}

答案 12 :(得分:0)

对我来说,它是按原样工作的。问题到底在哪里?

public static T FindThing<T>(this IList collection, int id) where T : IThing, new()
{
    foreach (T thing in collection)
    {
        if (thing.Id == id)
            return thing;
        }
    }

    return null; //work
    return (T)null; //work
    return null as T; //work
    return default(T); //work


}