C# 是否有内置的IEqualityComparer<;T>;对于System.Int32?
我们目前使用C# 是否有内置的IEqualityComparer<;T>;对于System.Int32?,c#,.net,xamarin.ios,.net-standard,C#,.net,Xamarin.ios,.net Standard,我们目前使用EqualityComparer.Default作为初始化通用字典的默认方式。但是,当字典的键为typeint时,它会在Xamarin.iOS上崩溃,并出现以下错误(但在我尝试过的许多其他平台上工作): 在仅aot模式下运行时,尝试JIT编译方法Lucene.Net.Support.LurchTable2:InternalInsert(int,Lucene.Net.Facet.Taxonomy.facetlab,int&,Lucene.Net.Support.LurchTable/A
EqualityComparer.Default
作为初始化通用字典的默认方式。但是,当字典的键为typeint
时,它会在Xamarin.iOS上崩溃,并出现以下错误(但在我尝试过的许多其他平台上工作):
在仅aot模式下运行时,尝试JIT编译方法Lucene.Net.Support.LurchTable2:InternalInsert(int,Lucene.Net.Facet.Taxonomy.facetlab,int&,Lucene.Net.Support.LurchTable/Add2Info)
。有关更多信息,请参阅
在Lucene.Net.Support.LurchTable2[TKey,TValue]。在Lucene.Net.Support.LurchTable2[TKey,TValue]。AddOrUpdate(TKey,TValue addValue,Lucene.Net.Support.KeyValueUpdate2[TKey,TValue]fnUpdate)中插入[T](TKey,T&value):0在Lucene.Net.Facet.Taxonomy.LRUHashMap2[TKey,TValue]。Put(TKey key,TValue value)in:0位于Lucene.Net.Facet.Taxonomy.DirectoryTaxonomyReader.GetOrdinal(Lucene.Net.Facet.Taxonomy.Facet标签cp)in:0位于Lucene.Net.Facet.Taxonomy.Int32TaxonomyFacets.GetTopChildren(System.Int32 topN,System.String dim,System.String[]path)in:0位于Login.MyMB.Lucene.Client.LuceneArticoliSearcher.GetListaArticoloxRicerCaavanzataConricercaSamplice(System.Collections.Generic.List1[T]ListParameter)in:0位于Login.MyMB.Lucene.Client.LuceneArticoliSearcher.GetListaArticoloConriceCaseMplice(System.Collections.Generic.List1[T]ListParameter)in:0位于MyMB.Forms.ricercaluce.RicercaArticoloLucene.GetListaArticoliXRicercaSemplice(Login.MyMB.Interface.IAmbiente-ambiente,Login.MyMB.Lucene.Client.lucenarticolisearcher-las,System.Collections.Generic.List`1[T]ListParameter,System.Boolean Isabilitatariercabarcode)in:0
在链接中,我找到了问题的原因(我想…):
值类型作为字典键使用值类型作为字典
键是有问题的,因为默认字典构造函数尝试使用EqualityComparer.default
EqualityComparer.default
,反过来,尝试使用反射实例化实现IEqualityComparer
i的新类型接口。这适用于引用类型(因为反射+创建新类型步骤被跳过),但对于值类型,一旦您尝试在设备上使用它,它就会崩溃并迅速燃烧。
解决方法:在新类型中手动实现IEqualityComparer
接口,并向字典(IEqualityComparer
)构造函数提供该类型的实例
问题:
是否有一种内置的跨平台方法来创建默认的IEqualityComparer
?我试图避免创建这样的类
private class Int32EqualityComparer : IEqualityComparer<int>
{
bool IEqualityComparer<int>.Equals(int x, int y)
{
return x.Equals(y);
}
int IEqualityComparer<int>.GetHashCode(int obj)
{
return obj.GetHashCode();
}
}
私有类Int32EqualityComparer:IEqualityComparer
{
布尔IEqualityComparer.Equals(整数x,整数y)
{
返回x等于(y);
}
int IEqualityComparer.GetHashCode(int obj)
{
返回obj.GetHashCode();
}
}
只是为了避免这个错误。它看起来不像,没有列出任何整数。在.NET标准中没有实现IEqualityComparer
,您可以通过搜索来确定
如果您打算自己实现IEqualityComparer
,则可能需要将T
约束为IEquatable
,以便涵盖多种类型,而不仅仅是int
。建议所有值类型按照执行IEquatable