6

在 C# 中是否可以将方法传递给可为空的 Func?

既不工作Func<A, bool>?也不Func?<A, bool>工作。

4

4 回答 4

18

那没有意义。
所有引用类型,包括Func<...>,都可以是null

可空类型适用于struct通常不能是 的值类型 (s) null

于 2012-05-15T14:45:45.767 回答
5

Func 是一个委托,它是一个引用类型。这意味着它已经可以为空(您可以将 null 传递给方法)。

于 2012-05-15T14:47:36.067 回答
2

Func -> 封装返回泛型参数指定类型的方法

如果返回类型为 void,则存在不同的委托 (Action)

Action -> 封装一个不返回值的方法。

如果要求 Func 接受可以接受 null(可空类型)的参数,或者要求 Func 返回可能为 null(可空类型)的值,则没有限制。

例如。

    Func<int?, int?, bool> intcomparer = 
    (a,b)=>
    {
    if(a.HasValue &&b.HasValue &&a==b) 
        return true;
        return false;
    } ;

    Func<int?, int?, bool?> nullintcomparer = 
    (a,b)=>
    {

    if(a.HasValue &&b.HasValue &&a==b) 
        return true;
    if(!a.HasValue || !b.HasValue)
       return null;
        return false;
    } ;

    var result1 = intcomparer(null,null); //FALSE
    var result2 = intcomparer(1,null); // FALSE
    var result3 = intcomparer(2,2); //TRUE


    var result4 = nullintcomparer(null,null); // null
    var result5 = nullintcomparer(1,null); // null
    var result6 = nullintcomparer(2,2); //TRUE
于 2012-05-15T14:57:29.243 回答
1

C# 1.0 - 7.x:

所有引用类型,包括作为委托的 Func,默认情况下都可以为 null。

C# > 8.x:

Func<T>必须标记为Func<T>?能够接收null默认参数值。

C# 1.0 - 7.x 的示例:

/// <summary>
/// Returns an unique absolute path based on the input absolute path.
/// <para>It adds suffix to file name if the input folder already has the file with the same name.</para>
/// </summary>
/// <param name="absolutePath">An valid absolute path to some file.</param>
/// <param name="getIndex">A suffix function which is added to original file name. The default value: " (n)"</param>
/// <returns>An unique absolute path. The suffix is used when necessary.</returns>
public static string GenerateUniqueAbsolutePath(string absolutePath, Func<UInt64, string> getIndex = null)
{
    if (getIndex == null)
    {
        getIndex = i => $" ({i})";
    }
    // ... other logic
}

>C# 8.x 的示例:

/// <summary>
/// Returns an unique absolute path based on the input absolute path.
/// <para>It adds suffix to file name if the input folder already has the file with the same name.</para>
/// </summary>
/// <param name="absolutePath">An valid absolute path to some file.</param>
/// <param name="getIndex">A suffix function which is added to original file name. The default value: " (n)"</param>
/// <returns>An unique absolute path. The suffix is used when necessary.</returns>
public static string GenerateUniqueAbsolutePath(string absolutePath, Func<UInt64, string>? getIndex = null)
{
    if (getIndex == null)
    {
        getIndex = i => $" ({i})";
    }
    // ... other logic
}
于 2019-11-22T10:03:51.657 回答