| File: IReferenceOrISignature.cs | Web Access |
| Project: src\roslyn\src\Compilers\Core\Portable\Microsoft.CodeAnalysis.csproj (Microsoft.CodeAnalysis) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. using System; using System.Runtime.CompilerServices; using Microsoft.Cci; namespace Microsoft.CodeAnalysis { /// <summary> /// Used to devirtualize ConcurrentDictionary for EqualityComparer{T}.Default and ReferenceEquals /// /// This type is to enable fast-path devirtualization in the Jit. Dictionary{K, V}, HashTable{T} /// and ConcurrentDictionary{K, V} will devirtualize (and potentially inline) the IEquatable{T}.Equals /// method for a struct when the Comparer is unspecified in .NET Core, .NET 5; whereas specifying /// a Comparer will make .Equals and GetHashcode slower interface calls. /// </summary> internal readonly struct IReferenceOrISignature : IEquatable<IReferenceOrISignature> { private readonly object _item; public IReferenceOrISignature(IReference item) => _item = item; public IReferenceOrISignature(ISignature item) => _item = item; // Needed to resolve ambiguity for types that implement both IReference and ISignature public IReferenceOrISignature(IMethodReference item) => _item = item; public bool Equals(IReferenceOrISignature other) => ReferenceEquals(_item, other._item); public override bool Equals(object? obj) => false; public override int GetHashCode() => RuntimeHelpers.GetHashCode(_item); public override string ToString() => _item.ToString() ?? "null"; internal object AsObject() => _item; } }