Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.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# C4中的C6 nullcheck扩展_C#_C# 4.0_C# 6.0 - Fatal编程技术网

C# C4中的C6 nullcheck扩展

C# C4中的C6 nullcheck扩展,c#,c#-4.0,c#-6.0,C#,C# 4.0,C# 6.0,如何在具有扩展的C 4中实现此功能: string challengeId; if(challengeId == mViewModel?.Challenge?.Id) 其中Challenge.Id是字符串 我想作一些扩展: public static TValue GetOrDefault<TObject, TValue>(this TObject obj, Func<TObject, TValue> getter, TValue defaultValue = defa

如何在具有扩展的C 4中实现此功能:

string challengeId;
if(challengeId == mViewModel?.Challenge?.Id)
其中Challenge.Id是字符串

我想作一些扩展:

public static TValue GetOrDefault<TObject, TValue>(this TObject obj, Func<TObject, TValue> getter, TValue defaultValue = default(TValue))
            where TObject : class
        {
            return obj == null ? defaultValue : getter(obj);
        }
在所有组合中都可以。如果Id不是字符串,我们想比较int,那该怎么办

其中Challenge.Id是int


对于值类型,null条件运算符返回可为null的值。您必须专门为返回nullables的值类型创建重载

像这样的方法应该会奏效:

public static TValue? GetOrDefault<TObject, TValue>(this TObject obj, Func<TObject, TValue> getter, TValue? defaultValue = default(TValue?))
    where TObject : class
    where TValue : struct
{
    return obj == null ? defaultValue : getter(obj);
}
第二种用法是不明确的,因为编译器不清楚重载的目的是什么。通用约束不足以解决重载问题

您必须通过指定足够的参数来清除要使用的重载,编译器可以推断哪些参数是正确的,或者指定类型参数,或者如我前面所建议的,更改方法的名称

mViewModel.GetOrDefault(x => x.Challenge).GetOrDefault(x => x.Id, default(int?))


你能具体说明你的问题吗?当Challenge.Id是int而challengeId是字符串时?您说是您编写的扩展名。你真的是自己写的吗?它的泛型类型参数名、参数名和样式注意事项与此处提供的完全相同。我想这是可能的,但这将是一个惊人的巧合。无论如何,challengeId==mViewModel.GetOrDefaultx=>x.Challeng.GetOrDefaultx=>x.Id将编译,除了challenge输入错误。它是否满足你的需求取决于你的需求。你的问题不清楚你想要什么。否则,只需省略主题:类。顺便说一下。对那些花时间试图帮助你的人来说,这是粗鲁的,而不是应该如何帮助你。交易应该是,作为对其他SO用户帮助的交换,您将问题留给其他SO用户去解决。谢谢您所做的一切
public static TValue? GetOrDefault<TObject, TValue>(this TObject obj, Func<TObject, TValue> getter, TValue? defaultValue = default(TValue?))
    where TObject : class
    where TValue : struct
{
    return obj == null ? defaultValue : getter(obj);
}
mViewModel.GetOrDefault(x => x.Challenge).GetOrDefault(x => x.Id)
mViewModel.GetOrDefault(x => x.Challenge).GetOrDefault(x => x.Id, default(int?))
mViewModel.GetOrDefault(x => x.Challenge).GetOrDefault<Challenge, int>(x => x.Id)
mViewModel.GetReferenceOrDefault(x => x.Challenge).GetValueOrDefault(x => x.Id)