2

次のコードを実行できないのはなぜですか?

    static int num = 0;
    static void Main(string[] args)
    {
        (num == 0) ? inc() : dec();
    }
    public static void inc()
    {
        num++; 
    }
    public static void dec()
    {
        num--;
    }

C# では、三項演算子 "?:" を使用して条件をチェックし、それに応じて値を返さずにメソッドを実行できないのはなぜですか? これと同等:

            if (num == 0) inc();
            else dec();

Java、C++ などの他の言語で同じルールが適用されるかどうかはわかりません...

4

5 に答える 5

5

Jon Skeetの答えは、C#が意図的にC++とは異なるルートをたどったことを完全に文書化しています。理由はわかりませんが、その質問も答えに値すると思いますので、やってみます。

C#は、C++およびJavaと多くの構文を共有しています。この場合、Javaの方法が選択されました。これは2 + 2;、スタンドアロンステートメントとして記述できないことと、三項演算子が値を返すことを要求することの両方に関係します。

これらの決定は両方とも、アクセスできないコードの排除に大きく関係していると思います。の+演算子は2 + 2最適化できるため、コード内で何らかの目的を果たしている場合、その目的は確実に機能しません。静的分析(コンパイルエラーまたは警告)は、理想的には、そのような場合にセマンティックの問題があるように思われることを通知し、アクセスできないコードを削除または書き換えることを強制する必要があります。

そのため、式は必ずしもステートメントではなくなり、Java / C#用にC文法を再定義する必要があります。式は常に値を返し、ステートメントは決して値を返しません。

現在?:if-elseは、少なくともそれらの典型的な使用法において、主に1つは式であり、もう1つはステートメントであるという点で異なります。したがって、再定義された文法は、単に無効な3値を禁止し、その目的のためにif推奨することを選択しました。else

于 2012-05-28T12:47:43.307 に答える
2

条件演算子(?:)は、ブール式の値に応じて2つの値のいずれかを返します。

それはあなたがあなたの質問で説明したようには機能しません。三項演算子のバイト数は次のとおりです

http://msdn.microsoft.com/en-us/library/ty67wk28%28v=vs.80%29.aspx

于 2012-05-28T12:10:32.020 に答える
2

ただし、次のように使用すると機能します。

static int num = 0;
static void Main(string[] args)
{
    num = (num == 0) ? inc(num) : dec(num);
}
public static int inc(int number)
{
    return number + 1;
}
public static int dec(int number)
{
    return number - 1;
}
于 2012-05-28T12:14:27.183 に答える
2

三項演算子はブール式に基づいて値を割り当てるためです。その基本的な C# 仕様。メソッドの戻り値の型が void である場合は、if - else または switch case を使用するのが最善です。

int a = true ? 0 : 1; //Always works

true ? 0 : 1; //This will never work.

または、例を少し変更します。

static int num = 0;

static void Main(string[] args)
{
    num = (num == 0) ? inc(num) : dec(num);
}

public static int inc(int lnum)
{
    return lnum + 1;
}

public static int dec(int lnum)
{
    return lnum - 1;
}
于 2012-05-28T12:08:52.430 に答える