Nullable Func‹T, TResult›

В С# можно передать метод с нулевым значением Func?

Ни Func<A, bool>?, ни Func?<A, bool> не работают.


person Sachin Kainth    schedule 15.05.2012    source источник


Ответы (4)


Это не имеет смысла.
Все ссылочные типы, включая Func<...>, уже могут быть null.

Типы, допускающие значение NULL, применяются к типам значений (structs), которые обычно не могут быть null.

person SLaks    schedule 15.05.2012
comment
@bto.rdz: А? Javascript вообще не имеет принудительного применения типов. - person SLaks; 22.05.2015

Func — это делегат, который является ссылочным типом. Это означает, что он уже допускает значение null (вы можете передать null методу).

person Andreas Schlapsi    schedule 15.05.2012

Func -> Инкапсулирует метод, который возвращает тип, заданный универсальным параметром.

Если тип возвращаемого значения недействителен, существует другой делегат (действие)

Действие ->Инкапсулирует метод, который не возвращает значение.

Если вы требуете, чтобы Func принимал параметры, которые могут принимать null (тип, допускающий значение null), или требуете, чтобы Func возвращал значение, которое может быть null (тип, допускающий значение 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
person Tilak    schedule 15.05.2012
comment
Он не говорит о возвращаемом типе. - person SLaks; 15.05.2012
comment
это отвечает на вопрос, который у меня возник при запросе Google. - person tylerlindell; 27.01.2020

C# 1.0 - 7.x:

Все ссылочные типы, включая Func как делегат, по умолчанию могут иметь значение null.

C# > 8.x:

Func<T> должен быть помечен как Func<T>?, чтобы иметь возможность получить null в качестве значения параметра по умолчанию.

Пример для С# 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
}
person KUTlime    schedule 22.11.2019