¿Por qué F# usando Xunit requiere información de tipo al afirmar la igualdad en cadenas?

StackOverflow https://stackoverflow.com/questions/9447219

  •  12-11-2019
  •  | 
  •  

Pregunta

Estoy usando F# y Xunit.(Soy relativamente nuevo en ambos)

Descubrí que cuando uso Assert.Equal() de Xunit necesito especificar "<string>" cuando los tipos que se comparan son cadenas.

Por ejemplo, esta ejecución y compila:

[<Fact>]
let Test_XunitStringAssertion() =
    let s1 = "Stuff"
    Assert.Equal<string>("Stuff",s1)

Mi pregunta es ¿por qué no puedo eliminar? "<string>" y simplemente afirmar "Assert.Equal("Stuff",s1)" ¿en cambio?

Me parece que el compilador conoce los tipos de ambos argumentos, entonces, ¿por qué tanto alboroto?

Aquí están los errores devueltos al compilar. Assert.Equal("Stuff",s1):

error FS0041: A unique overload for method 'Equal' could not be determined based on type information prior to this program point. The available overloads are shown below (or in the Error List window). A type annotation may be needed.
error FS0041: Possible overload: 'Assert.Equal<'T>(expected: 'T, actual: 'T) : unit'.
error FS0041: Possible overload: 'Assert.Equal<'T>(expected: seq<'T>, actual: seq<'T>) : unit'.
error FS0041: Possible overload: 'Assert.Equal<'T>(expected: 'T, actual: 'T, comparer: System.Collections.Generic.IEqualityComparer<'T>) : unit'.
error FS0041: Possible overload: 'Assert.Equal(expected: float, actual: float, precision: int) : unit'.
error FS0041: Possible overload: 'Assert.Equal(expected: decimal, actual: decimal, precision: int) : unit'.
error FS0041: Possible overload: 'Assert.Equal<'T>(expected: seq<'T>, actual: seq<'T>, comparer: System.Collections.Generic.IEqualityComparer<'T>) : unit'.
¿Fue útil?

Solución

Eso es porque string puede ser igualado tanto por el primero como por el segundo sobrecargas (recuerde: string :> seq<char>).

Otros consejos

Tu ejemplo con <string> eliminado se ejecuta sin errores para mí como era de esperar (aunque string :> seq<char> como señala @Ramon Snir, el algoritmo de resolución de sobrecarga resuelve la ambigüedad al reconocer que el suministrado string Los tipos están "más cerca" de string que seq<char>).

[<Fact>]
let Test_XunitStringAssertion() =
    let s1 = "Stuff"
    Assert.Equal("Stuff",s1)

Supongo que la muestra que proporcionaste no es exactamente la misma que el código real que te está causando problemas.Tal vez s1 en tu código real no es en realidad un string (o al menos el compilador no sabe que lo es).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top