[C#] Resolución de sobrecarga con CType'd Enum


Answers

Es cierto que estoy muy por encima de mi cabeza, pero lo siguiente no produce ningún error.

AreEqual(CType(CType(0, Int16), MyEnum), MyEnum.A) 

Donde como

AreEqual(CType(CType(0, Integer), MyEnum), MyEnum.A) 

Hace.

AreEqual(CType(1, MyEnum), MyEnum.A)

También compila bien.

Disculpas si esto es absurdo o inútil.

Question

Considera el siguiente ejemplo mínimo:

Module Module1
    Private Enum MyEnum
        A
    End Enum

    Public Sub Main(args As String())
        AreEqual(CType(0, MyEnum), MyEnum.A)    ' Error here
    End Sub

    Private Function AreEqual(Of T)(item1 As T, item2 As T) As Boolean
        Return False
    End Function

    Private Function AreEqual(item1 As Object, item2 As Object) As Boolean
        Return False
    End Function
End Module

Por alguna extraña razón, la resolución de sobrecarga falla en la línea marcada con "Error aquí":

Error 6 Error de resolución de sobrecarga porque ningún 'AreEqual' accesible es más específico para estos argumentos:

Private Function AreEqual(item1 As Object, item2 As Object) As Boolean : no es lo más específico.

Private Function AreEqual(Of MyEnum)(item1 As MyEnum, item2 As MyEnum) As Boolean : No es lo más específico.

¿Por qué la segunda función no es "más específica"? Tanto CType(0, MyEnum) como MyEnum.A deben ser expresiones que están tipadas estáticamente como MyEnum .

Curiosamente, solo puedo reproducir este problema al lanzar un Enum. AreEqual(CType(0, Int32), 0) y AreEqual(MyEnum.A, MyEnum.A) compilan sin problemas.

Sé cómo arreglar esto. Sé que puedo usar AreEqual(Of MyEnum)(...) . Esa no es la pregunta. Tengo curiosidad por qué sucede esto. ¿Algún error en el compilador? Curiosamente, el código C # correspondiente funciona:

enum MyEnum { A, B }
static void Main(string[] args)
{
    AreEqual((MyEnum)0, MyEnum.A);
}

static bool AreEqual<T>(T item1, T item2) { return false; }
static bool AreEqual(object item1, object item2) { return false; }