7

我想为 a < b < c 创建一个三元运算符,即 a < b && 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 返回的自定义对象,该对象跟踪其边界并了解它如何与对象的其他实例组合。本质上,这就是 LINQ-to-SQL 在组合 Where、Select 等方面的工作方式。)

但是您不能在 C# 中定义自己的运算符语法。

如果您对可以定义自己的运算符的语言感兴趣,您可以考虑研究 F#。

于 2010-02-05T18:22:02.263 回答
3

你不能那样做。您只能实现现有的运算符,并且没有三元 .<.<。C# 中的运算符。

此外,这样的运算符与现有的比较运算符会产生歧义。例如,表达式的a == b == c == d意思是((a == b) == c) == dor (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 回答