Я могу создать тернарные операторы в C#?

Я хочу создать тернарный оператор для <b <c, который является <b && b <c. или любая другая опция, можно думать об этом <b> c и так далее... Я - поклонник своей собственной краткой формы, и я хотел создать это, так как я изучил программирование в средней школе.

Как?

6
задан Scott S 5 February 2010 в 08:01
поделиться

6 ответов

Ты не можешь этого сделать. Можно реализовать только существующие операторы, а в C# нет тернарного оператора .<.<.

Кроме того, такой оператор был бы неоднозначен с существующими операторами сравнения. Например, будет ли выражение a == b == c == d означать ((a == b) == c) == d или (a == b == c) == d?

.
3
ответ дан 8 December 2019 в 13:45
поделиться

К сожалению, Вы не можете создавать свои собственные операторы на C#.

Вы можете использовать методы расширений для включения беглого синтаксиса вроде

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

Или, если бы Вы были очень умны, Вы могли бы сделать:

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

это хитро, но возможно. (Подсказка: определите пользовательский объект, который IsLessThan возвращает, который отслеживает его границы и понимает, как он комбинируется с другими экземплярами объекта. По сути, именно так LINQ-to-SQL работает с объединением Where, Select и т.д.)

Но вы не можете определить свой собственный синтаксис оператора на C#.

Если вас интересуют языки, в которых вы можете определять свои собственные операторы, вы можете рассмотреть возможность поиска в F#.

4
ответ дан 8 December 2019 в 13:45
поделиться

Вы пробовали искать тернарные операторы в Google, чтобы узнать, существует ли что-то уже?

0
ответ дан 8 December 2019 в 13:45
поделиться

Нет. Не в C#. Языковое расширение таким образом недоступно ни в одной из существующих версий C#, но Лука Болоньезе указал на использование компилятора в качестве сервиса и некоторой функциональности, которая могла бы позволить расширить язык таким образом: http://microsoftpdc.com/Sessions/FT11.

0
ответ дан 8 December 2019 в 13:45
поделиться

Если вы хотите сделать это для примитивных типов данных, вам не повезло. C# не поддерживает добавление операторов к ним.

В собственных типах данных можно вернуть специальный тип данных, который хранит промежуточный результат и результат сравнения. Однако я предлагаю придерживаться языка c# - если вам действительно нужен стиль оператора a < b < c, то переключитесь на Python.

0
ответ дан 8 December 2019 в 13:45
поделиться

Не верьте ненавистникам;)

Вы можете сделать это на 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);
    }
}
10
ответ дан 8 December 2019 в 13:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: