В С# можно передать метод с нулевым значением Func?
Ни Func<A, bool>?
, ни Func?<A, bool>
не работают.
В С# можно передать метод с нулевым значением Func?
Ни Func<A, bool>?
, ни Func?<A, bool>
не работают.
Это не имеет смысла.
Все ссылочные типы, включая Func<...>
, уже могут быть null
.
Типы, допускающие значение NULL, применяются к типам значений (struct
s), которые обычно не могут быть null
.
Func — это делегат, который является ссылочным типом. Это означает, что он уже допускает значение null (вы можете передать null методу).
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
Все ссылочные типы, включая Func как делегат, по умолчанию могут иметь значение null.
Func<T>
должен быть помечен как Func<T>?
, чтобы иметь возможность получить null
в качестве значения параметра по умолчанию.
/// <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
}
/// <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
}