我可以在C#中创建三元运算符吗?

时间:2010-02-05 07:56:10

标签: c# ternary-operator

我想为<创建一个三元运算符。 b< c是< b&& b< C。或者你能想到的任何其他选择< b> c等等......我是自己的短片形式的粉丝,自从我在高中学习编程以来,我一直想创造它。

如何?

6 个答案:

答案 0 :(得分:10)

不要相信仇敌;)

可以在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);
    }
}

答案 1 :(得分:4)

抱歉,您无法在C#中创建自己的运算符。

您可以使用扩展方法启用流畅的语法,例如

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

或者,如果你非常聪明,你可以这样做:

bool f = a.IsLessThan(b).IsLessThan(c);
这样做很棘手,但可能。 (提示:定义IsLessThan返回的自定义对象,该对象跟踪其边界并理解它与对象的其他实例的组合方式。本质上,这就是LINQ-to-SQL在组合Where,Select等方面的工作方式。)

但是你无法在C#中定义自己的运算符语法。

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

答案 2 :(得分:3)

你做不到。您只能实现现有的运算符,并且没有三元组。&lt;。&lt;。 C#中的运算符。

此外,这样的运算符与现有的比较运算符不一致。例如,表达式a == b == c == d((a == b) == c) == d还是(a == b == c) == d

答案 3 :(得分:0)

您是否尝试在Google中搜索三元运算符以查看是否存在某些内容?

答案 4 :(得分:0)

没有。不在C#中。这种方式的语言扩展在任何当前版本的C#中都不可用,但Luca Bolognese指出使用编译器作为服务和一些功能可以允许在这里以这种方式扩展语言:http://microsoftpdc.com/Sessions/FT11

答案 5 :(得分:0)

如果你想为原始数据类型做这件事,那你就不走运了。 C#不支持向这些添加运算符。

在您自己的数据类型中,可以返回一个特殊的数据类型,该数据类型存储中间结果和比较结果。但是,我建议您坚持使用c#语言 - 如果您真的需要a < b < c运算符样式,请切换到Python。