我想为 a < b < c 创建一个三元运算符,即 a < b && b < c。或者你能想到的任何其他选项 a < b > c 等等......我是我自己的短格式的粉丝,自从我在高中学习编程以来,我一直想创建它。
如何?
我想为 a < b < c 创建一个三元运算符,即 a < b && b < c。或者你能想到的任何其他选项 a < b > c 等等......我是我自己的短格式的粉丝,自从我在高中学习编程以来,我一直想创建它。
如何?
不要相信仇恨者;)
您可以在 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);
}
}
抱歉,您不能在 C# 中创建自己的运算符。
您可以使用扩展方法来启用流畅的语法,例如
bool f = b.IsBetween(a, c);
或者,如果你非常聪明,你可以这样做:
bool f = a.IsLessThan(b).IsLessThan(c);
这样做很棘手,但有可能。(提示:定义一个 IsLessThan 返回的自定义对象,该对象跟踪其边界并了解它如何与对象的其他实例组合。本质上,这就是 LINQ-to-SQL 在组合 Where、Select 等方面的工作方式。)
但是您不能在 C# 中定义自己的运算符语法。
如果您对可以定义自己的运算符的语言感兴趣,您可以考虑研究 F#。
你不能那样做。您只能实现现有的运算符,并且没有三元 .<.<。C# 中的运算符。
此外,这样的运算符与现有的比较运算符会产生歧义。例如,表达式的a == b == c == d
意思是((a == b) == c) == d
or (a == b == c) == d
?
您是否尝试过在 google 中搜索三元运算符以查看是否已存在某些内容?
不,不在 C# 中。这种方式的语言扩展在任何当前版本的 C# 中都不可用,但 Luca Bolognese 指出将编译器用作服务和一些可以允许以这种方式扩展语言的功能:http ://microsoftpdc.com/Sessions /FT11。
如果您想对原始数据类型执行此操作,那么您就不走运了。C# 不支持向它们添加运算符。
在您自己的数据类型中,可以返回存储中间结果和比较结果的特殊数据类型。但是,我建议您只使用 c# 语言 - 如果您真的想要a < b < c
操作符样式,请切换到 Python。