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

31 浏览
0 Comments

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

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

    static T FindThing(IList collection, int id) where T : IThing, new()
    {
        foreach (T thing in collection)
        {
            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.
    }

\n这给我带来了一个构建错误\n

\n“无法将null转换为类型参数\'T\',因为它可能是一个值类型。考虑使用\'default(T)\'代替。”\n

\n我能避免这个错误吗?

0
0 Comments

问题:如何在C#的通用方法中返回NULL?

原因:原始问题的提问者想要知道如何在C#的通用方法中返回NULL。通用方法允许返回null,但是在某些情况下,返回null可能会导致编译错误。为了解决这个问题,提问者询问是否有一种方法可以从通用方法中返回null。

解决方法:根据回答者的建议,可以通过调整约束来解决这个问题。通过将约束更改为where T : class,就可以允许返回null。这样,通用方法就可以返回null了。

感谢John Skeet的回答,因为他的回答提供了两种解决方案,所以我选择了他的回答作为最佳答案。此外,根据回答者的解释,返回类型是否需要实现IDisposable接口取决于项目的要求。大多数情况下,并不需要返回类型实现IDisposable接口。回答者应该明确这一点,但是这并不意味着回答是错误的。最后,回答者已经删除了回答中关于IDisposable的内容,因为这是一个错误。

代码示例:

public T MyGenericMethod() where T : class
{
    // Method implementation
    return null;
}

0
0 Comments

问题的原因是,用户想要在一个泛型方法中返回null,但是不知道怎么实现。根据给出的代码和评论,可以得出解决方法是使用default关键字来返回null。默认情况下,default关键字会返回泛型类型的默认值,对于引用类型,返回null。

以下是整理后的文章:

在C#中,有时候我们需要在一个泛型方法中返回null。但是,如何实现这个功能呢?

有一个解决方法是使用default关键字。default关键字会返回泛型类型的默认值。对于引用类型,默认值就是null。

下面是一个示例代码:

public T GetDefaultValue()
{
    return default(T);
}

在上面的代码中,我们定义了一个泛型方法GetDefaultValue(),该方法返回类型为T。在方法中,我们使用了default关键字来返回T类型的默认值。

通过使用default关键字,我们可以轻松地在泛型方法中返回null。

这是一个非常简单但是有用的技巧,可以帮助我们节省大量的时间和精力。

希望这篇文章对你有所帮助!谢谢Ricardo提供的建议!

0
0 Comments

问题的原因是在C#中如何从一个泛型方法中返回NULL。解决方法有三种:

1. 返回default关键字,如果T是引用类型(或可空值类型),则返回null;如果T是int类型,则返回0;如果T是char类型,则返回'\0'。具体的返回值可以参考C#官方文档中的默认值表格。

2. 如果你只想让T为引用类型,可以使用where T : class约束,并正常返回null。

3. 如果你只想让T为非空值类型,可以使用where T : struct约束,并在返回值为T?的方法中正常返回null。值得注意的是,这不是返回空引用,而是返回可空值类型的空值。

如果返回类型是枚举而不是类,应该怎么办?无法使用T : enum约束。

在.NET中,枚举类型实际上是一个非常轻量级的整数类型的包装。惯例是将0作为默认枚举值。

这样做的问题在于,如果你使用这个泛型方法来将一个数据库对象从DbNull转换为int,并且返回类型为T的default值,那么如果T是int类型,就会返回0。如果这个数字实际上是有意义的,那么在该字段为null的情况下,你将传递错误的数据。或者更好的例子是DateTime类型。如果字段是类似"DateClosed"的字段,并且返回null表示账户仍然处于开放状态,那么默认值DateTime将为1/1/0000,这意味着该账户在计算机发明之前就已关闭。

因此,你应该将其转换为Nullable或Nullable。如果使用非空类型并需要表示空值,那么将会有麻烦。

我同意,我只是想提出这个问题。我认为我一直在做的是像MyMethod();这样假设它是一个非空类型,然后用MyMethod();来假设它是一个可空类型。因此,在我的场景中,我可以使用一个临时变量来捕获null,并从那里进行处理。

自从C# 7.1(2017年8月)起,你可以简化第一种方法的语法,变成return default;,因为类型会自动推断。

0