Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.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# 是否有内置的IEqualityComparer<;T>;对于System.Int32?_C#_.net_Xamarin.ios_.net Standard - Fatal编程技术网

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
作为初始化通用字典的默认方式。但是,当字典的键为type
int
时,它会在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