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()。这就是我的答案。