Я хочу создать тернарный оператор для <b <c, который является <b && b <c. или любая другая опция, можно думать об этом <b> c и так далее... Я - поклонник своей собственной краткой формы, и я хотел создать это, так как я изучил программирование в средней школе.
Как?
Ты не можешь этого сделать. Можно реализовать только существующие операторы, а в C# нет тернарного оператора .<.<.
Кроме того, такой оператор был бы неоднозначен с существующими операторами сравнения. Например, будет ли выражение a == b == c == d
означать ((a == b) == c) == d
или (a == b == c) == d
?
К сожалению, Вы не можете создавать свои собственные операторы на C#.
Вы можете использовать методы расширений для включения беглого синтаксиса вроде
bool f = b.IsBetween(a, c);
Или, если бы Вы были очень умны, Вы могли бы сделать:
bool f = a.IsLessThan(b).IsLessThan(c);
это хитро, но возможно. (Подсказка: определите пользовательский объект, который IsLessThan возвращает, который отслеживает его границы и понимает, как он комбинируется с другими экземплярами объекта. По сути, именно так LINQ-to-SQL работает с объединением Where, Select и т.д.)
Но вы не можете определить свой собственный синтаксис оператора на C#.
Если вас интересуют языки, в которых вы можете определять свои собственные операторы, вы можете рассмотреть возможность поиска в F#.
Вы пробовали искать тернарные операторы в Google, чтобы узнать, существует ли что-то уже?
Нет. Не в C#. Языковое расширение таким образом недоступно ни в одной из существующих версий C#, но Лука Болоньезе указал на использование компилятора в качестве сервиса и некоторой функциональности, которая могла бы позволить расширить язык таким образом: http://microsoftpdc.com/Sessions/FT11.
Если вы хотите сделать это для примитивных типов данных, вам не повезло. C# не поддерживает добавление операторов к ним.
В собственных типах данных можно вернуть специальный тип данных, который хранит промежуточный результат и результат сравнения. Однако я предлагаю придерживаться языка c# - если вам действительно нужен стиль оператора a < b < c
, то переключитесь на Python.
Не верьте ненавистникам;)
Вы можете сделать это на 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);
}
}