Error de tipo: la memoria no se puede convertir implícitamente al tipo esperado

Tengo una función que devuelve una lista de BetPropositioncontratos inteligentes:

function getBetsForMatchup(uint matchupIdentifier) public returns (BetProposition[]) {
        return bets[matchupIdentifier];
    }

Más tarde, inicializo una matriz de variables locales como tal, para poder recorrerlas:

   BetProposition[] betsToCancel = getBetsForMatchup(matchupIdentifier);

Sin embargo, esto no parece funcionar y me sale este error:

TypeError: Type contract BetProposition[] memory is not implicitly convertible to expected type contract BetProposition[] storage pointer.
    BetProposition[] betsToCancel = getBetsForMatchup(matchupIdentifier);
    ^------------------------------------------------------------------^

No estoy totalmente seguro de lo que esto significa. Cualquier ayuda apreciada. Gracias

Respuestas (1)

El compilador cree que está tratando de almacenar el valor de retorno de getBetsForMatchup en almacenamiento de contrato (permanente).

Intenta cambiar

   BetProposition[] betsToCancel = getBetsForMatchup(matchupIdentifier);

a

   BetProposition[] memory betsToCancel = getBetsForMatchup(matchupIdentifier);

Esto compilado en remix:

   pragma solidity ^0.4.20;
   contract BetProposition {
       uint public somevar;

       function BetProposition(uint _some) public {
         somevar = _some;
       }
   }

   contract Tester2 {
        mapping(uint => BetProposition[]) bets;

        function getBetsForMatchup(uint matchupIdentifier) public view returns (BetProposition[]) {
            return bets[matchupIdentifier];
        }

        function other(uint matchupIdentifier) public view returns(uint) {
             uint total = 0;
             BetProposition[] memory betsToCancel = getBetsForMatchup(matchupIdentifier);
             for (uint i = 0; i < betsToCancel.length; i++) {
                 total = total + betsToCancel[i].somevar();
             }
             return total;
        }
}
¿Es esta una característica relativamente nueva? Ahora aparece el siguiente error: UnimplementedFeatureError: la copia de la estructura de tipo BetCard.Matchup memory[3] de la memoria en el almacenamiento aún no es compatible.
Actualicé mi respuesta con una muestra que pude compilar en remix. Tenga en cuenta que esto está usando solidez ^ 0.4.20. Además, si está tratando de llamar a getBetsForMatchup externamente (es decir, desde javascript), tendrá problemas ya que las funciones que devuelven tipos de contrato no son compatibles a través de abi.
@Howard, ¿es ahí donde entra "pragma experimental ABIEncoderV2"? Se le advierte que no lo use en producción, pero vale la pena intentarlo dependiendo de cómo se use.
Ese pragma funciona para devolver estructuras, no estoy seguro acerca de los contratos refs. Sin duda es útil, siempre que tenga el control total de su cliente.