Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 重载参数受约束的函数或在其他地方找到方法_C# - Fatal编程技术网

C# 重载参数受约束的函数或在其他地方找到方法

C# 重载参数受约束的函数或在其他地方找到方法,c#,C#,我正在尝试编写一个名为NotNull的函数,它的工作方式类似于“.” 例如: a.NotNull( x => x.AFunc ) 如果a为null,则NotNull返回AFunc的泛型类型,否则NotNull返回AFunc的返回值 我写过: public static TReturn NotNullClass<TObject, TReturn>(this TObject obj, Func<TObject, TReturn> func) where TReturn

我正在尝试编写一个名为NotNull的函数,它的工作方式类似于“.”

例如:

a.NotNull( x => x.AFunc )
如果a为null,则NotNull返回AFunc的泛型类型,否则NotNull返回AFunc的返回值

我写过:

public static TReturn NotNullClass<TObject, TReturn>(this TObject obj, Func<TObject, TReturn> func) where TReturn : class
{
    if (obj == null)
    {
        return null;
    }
    else
    {
        return func(obj);
    }
}

public static TReturn NotNullStruct<TObject, TReturn>(this TObject obj, Func<TObject, TReturn> func) where TReturn : struct
{
    if (obj == null)
    {
        return new TReturn();
    }
    else
    {
        return func(obj);
    }
}
public static TReturn NotNullClass(这个TObject对象,Func Func),其中TReturn:class
{
if(obj==null)
{
返回null;
}
其他的
{
返回函数(obj);
}
}
公共静态TReturn NotNullStruct(此TObject对象,Func Func),其中TReturn:struct
{
if(obj==null)
{
返回新的TReturn();
}
其他的
{
返回函数(obj);
}
}
问题在于,如果TReturn是类或结构,则无法通过重载或静态测试将两个函数重新组合到一个泛型函数中

如何仅使用一个泛型函数编写此函数?

公共静态树返回NotNull(这是TObject obj,Func Func)
    public static TReturn NotNull<TObject, TReturn>(this TObject obj, Func<TObject, TReturn> func)
    {
        if (object.ReferenceEquals(obj, null))
        {
            return default(TReturn);
        }

        return func(obj);
    }
{ if(object.ReferenceEquals(obj,null)) { 返回默认值(TReturn); } 返回函数(obj); }
此扩展方法可用于引用类型和值类型(对于ToObject)。对于值类型(结构),条件始终为true,并将调用给定的func


由于
default(TReturn)
此方法也适用于TReturn的引用和值类型。

在这种情况下,“default”做得很好,ty。但我想知道是否有一种方法可以解决这种重载…类的默认值等于null您不需要两个不同的版本。