Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.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#,是否有一条线与此等效: void AcceptChanges() => Data != null ? DoSomethingWithData(Data); 我想知道为什么到目前为止c#还没有提到这一点 由于void返回类型,也不可能执行类似的操作 void AcceptChanges() => Data != null ? DoSomethingWithData(Data) : null; 如果你不打算打电话的话,做这样的事情会更好 void AcceptChanges() =&

是否有一条线与此等效:

void AcceptChanges() => Data != null ? DoSomethingWithData(Data);
我想知道为什么到目前为止c#还没有提到这一点

由于void返回类型,也不可能执行类似的操作

void AcceptChanges() => Data != null ? DoSomethingWithData(Data) : null;
如果你不打算打电话的话,做这样的事情会更好

void AcceptChanges() => Data != null ? DoSomethingWithData(Data) : void;
还是新的含义??(因为在这种情况下bool表达式iitself不能为null)

编辑:最接近的解决方案是使用代理:

using System;
using System.Diagnostics.CodeAnalysis;

public static class VoidHelper
{
    // ReSharper disable once UnusedParameter.Global
    public static void RunVoid([NotNull] this object source, bool condition, Action action) =>
        RunVoid(condition, action);
    public static void RunVoid(bool condition, Action action)
    {
        if (condition)
            action();
    }

    // ReSharper disable once UnusedParameter.Global
    public static void RunVoid<T>([NotNull] this object source, bool condition, Action<T> action, T arg) =>
        RunVoid(condition, action, arg);
    public static void RunVoid<T>(bool condition, Action<T> action, T arg)
    {
        if (condition)
            action(arg);
    }

    // Add more args if neccessary

    public static void Test(object data) => RunVoid(data != null, () => DoSomethingWithData(data));

    private static void DoSomethingWithData(object data) { }
}
使用系统;
使用System.Diagnostics.CodeAnalysis;
公共静态类帮助器
{
//ReSharper禁用一次未使用的参数。全局
public static void RunVoid([NotNull]此对象源、bool条件、操作)=>
RunVoid(条件、动作);
公共静态无效运行无效(布尔条件,动作)
{
如果(条件)
动作();
}
//ReSharper禁用一次未使用的参数。全局
public static void RunVoid([NotNull]此对象源、bool条件、动作动作、T参数)=>
RunVoid(条件、动作、参数);
公共静态无效运行无效(布尔条件、动作动作、T参数)
{
如果(条件)
动作(arg);
}
//如有必要,添加更多参数
公共静态无效测试(对象数据)=>RunVoid(数据!=null,()=>DoSomethingWithData(数据));
私有静态void DoSomethingWithData(对象数据){}
}

选项1:将方法转换为,并使用null传播运算符。仅当实例不为null时才会调用该方法

void AcceptChanges() => Data?.DoSomethingWithData();
选项2:不要使用表达式体语句,在
if
中使用简单的空检查

void AcceptChanges()
{
    if (Data != null)
    {
        DoSomethingWithData(Data);
    }
}

为什么不干脆
if(Data!=null)DoSomethingWithData(Data)
?@JonathonChase不能用作表达式体函数。
我想知道为什么到目前为止c中还没有解决这个问题。
← 这不是一个问题。如果你想要一个功能请求,那么这个请求也是错误的。至于为什么它不能作为一种语言规范来实现,这只是一种猜测,只能从观点中得出答案。Eric Lippert建议阅读:@sven krauter我相信这里的选项1就是你所寻找的选项1在逻辑上是错误的。包含AcceptChanges的对象应该处理数据,而不是扩展。@SvenKrauter扩展方法从
SomeObject.SomeExtensionMethod()编译
to
SomeStaticClass.SomeExtensionMethod(SomeObject),这是选项1所建议的。
void AcceptChanges()
{
    if (Data != null)
    {
        DoSomethingWithData(Data);
    }
}