unity switch espaƱol enum c# vb.net casting enums overload-resolution

switch - enum to list c#



ResoluciĆ³n de sobrecarga con CType''d Enum (3)

Creo que su problema es que no está restringiendo su tipo genérico T. Así que también podría ser un objeto.

es decir, si T es de tipo objeto, entonces estos son idénticos cuando son traducidos al lenguaje intermedio común por el compilador:

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

No veo por qué necesitas ambos. T atenderá el objeto. ¿Así que solo suelta el segundo y todo debería funcionar?

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; }


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.


Está relacionado con enteros, específicamente cero. Creo que es un artefacto de la Opción estricta no del todo definido. Noto el tipo de devolución por defecto (en Intellisense) para CType () es un objeto. Curiosamente, hacer cualquiera de estas cosas elimina el error:

  • Dando a MyEnum cualquier tipo que no sea entero
  • AreEqual (0, MyEnum.A)
  • AreEqual (CType (1, MyEnum), MyEnum.A)

Sí. Cosas locas, ¡bien encuentra a Heinzi!