7

a < b && b < c である a < b < c の三項演算子を作成したいと思います。または、思いつく他のオプション a < b > c など... 私は自分のショートフォームのファンであり、高校でプログラミングを学んだときから、それを作成したいと思っていました。

どのように?

4

6 に答える 6

11

嫌いな人を信じないでください;)

これはC#で実行できます。実装例を次に示します。Iconが行う方法に基づいてチェーンを作成しまし。比較が成功した場合、結果は正しいパラメーターの結果になります。それ以外の場合は、特別な「失敗した」結果が返されます。

使用する必要がある唯一の追加の構文はChain()、最初の項目の後の呼び出しです。

class Program
{
    static void Main(string[] args)
    {
        if (2.Chain() < 3 < 4)
        {
            Console.WriteLine("Yay!");
        }
    }
}

public class Chainable<T> where T : IComparable<T>
{
    public Chainable(T value)
    {
        Value = value;
        Failed = false;
    }

    public Chainable()
    {
        Failed = true;
    }

    public readonly T Value;
    public readonly bool Failed;

    public static Chainable<T> Fail { get { return new Chainable<T>(); } }

    public static Chainable<T> operator <(Chainable<T> me, T other)
    {
        if (me.Failed)
            return Fail;

        return me.Value.CompareTo(other) == -1
                   ? new Chainable<T>(other)
                   : Fail;
    }

    public static Chainable<T> operator >(Chainable<T> me, T other)
    {
        if (me.Failed)
            return Fail;

        return me.Value.CompareTo(other) == 1
                   ? new Chainable<T>(other)
                   : Fail;
    }

    public static Chainable<T> operator ==(Chainable<T> me, T other)
    {
        if (me.Failed)
            return Fail;

        return me.Value.CompareTo(other) == 0
                   ? new Chainable<T>(other)
                   : Fail;
    }

    public static Chainable<T> operator !=(Chainable<T> me, T other)
    {
        if (me.Failed)
            return Fail;

        return me.Value.CompareTo(other) != 0
                   ? new Chainable<T>(other)
                   : Fail;
    }

    public static bool operator true(Chainable<T> me)
    {
        return !me.Failed;
    }

    public static bool operator false(Chainable<T> me)
    {
        return me.Failed;
    }

    public override bool Equals(object obj)
    {
        return Value.Equals(obj);
    }

    public override int GetHashCode()
    {
        return Value.GetHashCode();
    }
}

public static class ChainExt
{
    public static Chainable<T> Chain<T>(this T value) where T : IComparable<T>
    {
        return new Chainable<T>(value);
    }
}
于 2010-05-12T23:51:39.020 に答える
4

申し訳ありませんが、C# で独自の演算子を作成することはできません。

拡張メソッドを使用して、次のような流暢な構文を有効にすることができます

bool f = b.IsBetween(a, c);

または、非常に賢い場合は、次のようにすることもできます。

bool f = a.IsLessThan(b).IsLessThan(c);

そうするのは難しいですが、可能です。(ヒント: IsLessThan が返すカスタム オブジェクトを定義して、その境界を追跡し、それがオブジェクトの他のインスタンスとどのように組み合わされるかを理解します。本質的に、これは、Where、Select などの組み合わせに関して LINQ-to-SQL がどのように機能するかです。)

ただし、C# で独自の演算子構文を定義することはできません。

独自の演算子を定義できる言語に興味がある場合は、F# を調べることを検討してください。

于 2010-02-05T18:22:02.263 に答える
3

あなたはそれをすることはできません。実装できるのは既存の演算子のみで、三項演算子はありません。<。<。C#の演算子。

さらに、そのような演算子は、既存の比較演算子とあいまいになります。たとえば、式はまたはをa == b == c == d意味します((a == b) == c) == d(a == b == c) == d

于 2010-02-05T08:06:10.333 に答える
0

何かがすでに存在するかどうかを確認するために、Googleで三項演算子を検索してみましたか?

于 2010-02-05T08:05:36.427 に答える
0

いいえ、C# にはありません。この方法での言語拡張は、現在のバージョンの C# では利用できませんが、Luca Bolognese は、コンパイラをサービスとして使用し、このような方法で言語を拡張できるいくつかの機能をここで指摘しました: http://microsoftpdc.com/Sessions /FT11 .

于 2010-02-05T08:06:25.333 に答える
0

プリミティブ データ型に対してそれを行いたい場合は、運が悪いです。C# は、それらへの演算子の追加をサポートしていません。

独自のデータ型では、中間結果と比較結果を格納する特別なデータ型を返すことができます。ただし、C# 言語に固執することをお勧めしますa < b < c。演算子スタイルが本当に必要な場合は、Python に切り替えてください。

于 2010-02-05T08:06:35.693 に答える