Tengo un VB.NET la función de la siguiente, el parámetro » x » que se pasa a la función es de Tipo ‘Single’. Sin embargo, quiero escribir la función para que pueda aceptar cualquier tipo numérico, tales como ‘Single’, ‘Doble’ y ‘Entero’. Yo sé una manera de hacerlo es escribir 3 funciones con el mismo nombre, pero sería tedioso. Puede alguien sugerir alguna idea? Gracias.

Public Function Square(x As Single) As Single
  Return x * x
End Function
yoda.arachsys.com/csharp/genericoperators.html
Complementarias enlace converter.telerik.com – no parece jugar muy bien con las lambdas (O VB solo chupa mucho? Yo no sé)
Aunque es bastante fácil para hacer las funciones genéricas. Usted no puede utilizar los operadores en el cuerpo del método.
Ese método no es realmente un buen candidato para ser genéricos porque no hay ninguna restricción de que se puede aplicar a un parámetro de tipo genérico que incluye todos los tipos desea y excluir a todos los demás. No hay ningún tipo de base o interfaz que acaba tipos numéricos heredar o implementar. Usted debe seguir con la sobrecarga. No utilizar funciones como la de los genéricos sólo porque usted puede.

OriginalEl autor N.T.C | 2014-08-12

3 Comentarios

  1. 8

    pruebe el siguiente método

    Public Function Square(Of T)(ByVal x As Object) As T
        Dim b As Object = Val(x) * Val(x)
        Return CType(b, T)
    End Function

    Usted puede usar la función anterior como este

    Dim p As Integer = Square(Of Integer)(10)
    Dim d As Double = Square(Of Double)(1.5)
    Sólo estoy curioso acerca de lo caro que sería que si la función se llama un montón. Al parecer CType tomaría algunos recursos computacionales?

    OriginalEl autor Shell

  2. 2

    Puede restringir el tipo genérico IConvertible y Structure. Los siguientes tipos de datos implementa la IConvertible interfaz:

    • Sistema.Boolean
    • Sistema.Byte
    • Sistema.Char
    • Sistema.DateTime
    • Sistema.DBNull
    • Sistema.Decimal
    • Sistema.Doble
    • Sistema.Enum
    • Sistema.Int16
    • Sistema.Int32
    • Sistema.Int64
    • Sistema.SByte
    • Sistema.Solo
    • Sistema.Cadena de
    • Sistema.UInt16
    • Sistema.UInt32
    • Sistema.UInt64

    Aquí está una reescritura de el código que se encuentra en el enlace proporcionado por SLaks:

    Public Function Square(Of T As {IConvertible, Structure})(x As T) As T
        'TODO: If (GetType(T) Is GetType(Date)) Then Throw New InvalidOperationException()
        Dim left As ParameterExpression = Expression.Parameter(GetType(T), "x")
        Dim right As ParameterExpression = Expression.Parameter(GetType(T), "x")
        Dim body As BinaryExpression = Expression.Multiply(left, right)
        Dim method As Func(Of T, T, T) = Expression.Lambda(Of Func(Of T, T, T))(body, left, right).Compile()
        Return method(x, x)
    End Function

    Referencia: https://jonskeet.uk/csharp/miscutil/usage/genericoperators.html

    OriginalEl autor Bjørn-Roger Kringsjå

  3. 0

    El código permite que cualquier valor publicado a través de Arg pero sólo valores numéricos serán procesados. El valor devuelto debe ser doble porque Val devuelve doble sólo.

    La De T permite genérica de los tipos de objetos que se presentan.

       Private Function sqr(Of T)(Arg As T) As Double
        If IsNumeric(Arg) Then
            Return Val(Arg) * Val(Arg)
        Else
            Return 0
        End If
    
      End Function
    se aceptan la mayoría de los valores, sino que sólo devolverá un valor numérico.
    Por favor, explique su respuesta

    OriginalEl autor Tripweed

Dejar respuesta

Please enter your comment!
Please enter your name here