Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.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#_Generics - Fatal编程技术网

C# 什么;其中;子句将使此通用方法有效吗?

C# 什么;其中;子句将使此通用方法有效吗?,c#,generics,C#,Generics,考虑一下这一公认的精心设计的通用定义: private void Foo<T,BASETYPE>(PropertyInfo prop, BASETYPE o1, BASETYPE o2) { T value1 = (T) prop.GetValue(o1, null); T value2 = (T) prop.GetValue(o2, null); if (value1 != value2) Co

考虑一下这一公认的精心设计的通用定义:

    private void Foo<T,BASETYPE>(PropertyInfo prop, BASETYPE o1, BASETYPE o2)
    {
        T value1 = (T) prop.GetValue(o1, null);
        T value2 = (T) prop.GetValue(o2, null);
        if (value1 != value2)
            Console.WriteLine("NOT EQUAL");
    }
虽然在“一般情况”中,我理解错误消息是有效的,但在本例中,我只希望例程用于某些标准类型:System.Int64、System.String等,所有这些类型都支持==和!=接线员

我假设可以用“where”子句来解决这个问题,但是IComparable和eQualable没有帮助

有人知道正确的“where”子句是什么吗


弗兰克

不幸的是,我认为没有。您需要使用
.Equals()

不幸的是,我认为没有。您需要使用
.Equals()

,因为System.Int64、System.String等。。从清单中,您可以使用

where T : IComparable
并使用
CompareTo()
而不是
=

例如,这段代码可以编译

private void Foo<T>(object o) where T : IComparable
{
    T v1 = default(T);
    T v2 = default(T);
    if(v1.CompareTo(v2)  != 0)
    {
        Console.WriteLine("Not Equal");
    }
}

private void Bar()
{
    Foo<string>(new object());
}
私有void Foo(对象o),其中T:i可比较
{
T v1=默认值(T);
T v2=默认值(T);
如果(v1.与(v2)!=0相比)
{
控制台。写入线(“不相等”);
}
}
专用空格键()
{
Foo(新对象());
}

自System.Int64、System.String等以来。。从清单中,您可以使用

where T : IComparable
并使用
CompareTo()
而不是
=

例如,这段代码可以编译

private void Foo<T>(object o) where T : IComparable
{
    T v1 = default(T);
    T v2 = default(T);
    if(v1.CompareTo(v2)  != 0)
    {
        Console.WriteLine("Not Equal");
    }
}

private void Bar()
{
    Foo<string>(new object());
}
私有void Foo(对象o),其中T:i可比较
{
T v1=默认值(T);
T v2=默认值(T);
如果(v1.与(v2)!=0相比)
{
控制台。写入线(“不相等”);
}
}
专用空格键()
{
Foo(新对象());
}

您可以使用所有类型都具有的
Equals()
实例方法,静态
对象.ReferenceEquals()
对象.Equals()
方法,或者您可以使用
EqualityComparer.Default.Equals()
方法。

您可以使用所有类型都具有的
Equals()
实例方法,静态
Object.ReferenceEquals()
Object.Equals()
方法,或者您可以使用
EqualityComparer.Default.Equals()
方法。

如果您愿意接受性能影响,可以使用

if (Comparer<T>.Default.Compare(value1, value2) == 0))
{
    Console.WriteLine("NOT EQUAL");
}
if(Comparer.Default.Compare(value1,value2)==0))
{
控制台。写入线(“不相等”);
}

如果您愿意接受性能冲击,您可以使用

if (Comparer<T>.Default.Compare(value1, value2) == 0))
{
    Console.WriteLine("NOT EQUAL");
}
if(Comparer.Default.Compare(value1,value2)==0))
{
控制台。写入线(“不相等”);
}

我想你做不到。没有运算符约束,所以无法告诉编译器它应该只允许带有!=要呼叫的接线员。您可以使用.Equals方法,因为它位于基本对象类中

下面是一篇讨论运算符约束的文章:
我想你做不到。没有运算符约束,所以无法告诉编译器它应该只允许带有!=要呼叫的接线员。您可以使用.Equals方法,因为它位于基本对象类中

下面是一篇讨论运算符约束的文章:

这很有趣。我以前从未见过这种情况。是什么导致性能下降?为什么不使用object.Equals?这很有趣。我以前从未见过这种情况。是什么导致性能下降?为什么不使用object.Equals呢?这比代码需要的更具体
IEquatable
就是您所需要的。当您确实不需要IComparable的排序功能时,这似乎是对类型的不必要的限制。@Matt@luqui-这两个接口是否都限制了您的选择?我想你们都同意IEquatable用于比较,IComparable用于排序。如果您的类型实现了其中一个而不是另一个,那么不管发生什么,您最终都会过滤可用对象?@Ritch:您根本不需要where子句来解决这个问题。@Matt Right。Just.Equals()。这就是我在回答中所说的。这比代码需要的更具体
IEquatable
就是您所需要的。当您确实不需要IComparable的排序功能时,这似乎是对类型的不必要的限制。@Matt@luqui-这两个接口是否都限制了您的选择?我想你们都同意IEquatable用于比较,IComparable用于排序。如果您的类型实现了其中一个而不是另一个,那么不管发生什么,您最终都会过滤可用对象?@Ritch:您根本不需要where子句来解决这个问题。@Matt Right。Just.Equals()。这就是我的答案。