Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 比较通用方法c中的两个值#_C#_Generics_Comparison_Operators_Operands - Fatal编程技术网

C# 比较通用方法c中的两个值#

C# 比较通用方法c中的两个值#,c#,generics,comparison,operators,operands,C#,Generics,Comparison,Operators,Operands,我认为我的代码对于我想要实现的目标是不言自明的: private bool Comparison<T>(T operatorOne, T operatorTwo, string operand) { switch (operand.ToLower()) { case "=": return operatorOne.Equals(operatorTwo); case

我认为我的代码对于我想要实现的目标是不言自明的:

private bool Comparison<T>(T operatorOne, T operatorTwo, string operand)
    {
        switch (operand.ToLower())
        {
            case "=":
                return operatorOne.Equals(operatorTwo);
            case "<":
                return operatorOne < operatorTwo;
            case ">":
                return operatorOne > operatorTwo;
            case "contains":
                return operatorOne.ToString().Contains(operatorTwo.ToString());
            default:
                return false;
        }
    }
私有布尔比较(T运算符one、T运算符two、字符串操作数)
{
开关(操作数.ToLower())
{
案例“=”:
返回运算符one.Equals(运算符two);
案例“”:
返回运算符one>operatorTwo;
案例“包含”:
返回运算符one.ToString().Contains(运算符two.ToString());
违约:
返回false;
}
}
这给了我一个错误:

Error   16  Operator '>','<' cannot be applied to operands of type 'T' and 'T'
Error 16运算符'>','可用于比较。请注意,如果
T
未实现
IComparable
IComparable
Comparer.Default.Compare
将抛出异常

要确保
T
实现
IComparable
,可以在其中添加
T:IComparable
约束。(它将排除实现
IComparable
,但不实现
IComparable
的类。仍然可以接受,因为许多实现
IComparable
的类也实现了
IComparable
。)

私有布尔比较(T运算符one、T运算符two、字符串操作数)
其中T:i可比较
{
开关(操作数.ToLower())
{
案例“=”:
返回Comparer.Default.Compare(运算符一、运算符二)=0;
案例“”:
返回Comparer.Default.Compare(运算符一、运算符二)>0;
案例“包含”:
返回运算符one.ToString().Contains(运算符two.ToString());
违约:
返回false;
}
}
p.S.

按照Servy的建议,您还可以将
IComparer
作为额外参数传递给函数。它将允许覆盖既不实现
IComparable
也不实现
IComparable
的类型,因此
Comparer.Default
对它们不起作用


此外,Timothyshiels还推荐了Comparer.Default(默认值)

“运算符”和“操作数”的概念。在表达式
a+b
中,
a
b
是操作数,
+
是运算符。是的,对不起!!我的错:)你对T了解多少,如果你规定T:IComparable在哪里,你也许可以不受惩罚。@mrtig T在我的例子中只能是int,double,float,decimal,string,char@isumit使用Comparer.Default,您甚至可以删除
where
约束。@AlexD您可以,但不应该,除非您接受
IComparer
作为参数。如果类型未实现
IComparable
,则给定代码将在运行时失败;有了泛型约束,如果使用了不合适的类型,代码将在编译时失败。@Servy我刚刚编辑了答案。这里的一个小问题是
Comparer.Default.Compare
可能返回
IComparable
IComparable
,这很难通过
where
约束来表达。我们可以说,
其中IComparable
,因为实现
IComparable
的类通常也实现
IComparable
。但它仍然打开了一个只实现了
IComparable
的角落。@AlexD这就是为什么我总是接受比较器作为参数,而不是期望实现默认比较器的原因。你可以看到BCL也在做同样的事情。这允许使用未实现任何一个接口的类型。@Servy您的意思是将比较器作为
Comparison
函数的额外参数吗?当然,这种比较器可以进行任何比较,但它会更改函数签名。
private bool Comparison<T>(T operatorOne, T operatorTwo, string operand)
    where T: IComparable
{
    switch(operand.ToLower())
    {
        case "=":
            return Comparer<T>.Default.Compare(operatorOne, operatorTwo) == 0;
        case "<":
            return Comparer<T>.Default.Compare(operatorOne, operatorTwo) < 0;
        case ">":
            return Comparer<T>.Default.Compare(operatorOne, operatorTwo) > 0;
        case "contains":
            return operatorOne.ToString().Contains(operatorTwo.ToString());
        default:
            return false;
    }
}