Compilador de Solidity - Error: Identificador ya declarado

Código fuente completo del archivo 'Test.sol':

pragma solidity ^0.4.23;


contract Mortal{

    address owner;

    string ownerInfo = "Contract Owner name XYZ";

    constructor () public {
        owner = msg.sender;
    }

    function kill () public {
        if (msg.sender == owner) {
            selfdestruct(owner);
        }
    }

    function ownerInfo() public view returns (string) {
        return ownerInfo;
    }

}


contract Test is Mortal {

    string message = "Hello World!";

    constructor () public {
    }

    function getMessage() public view returns (string){
        return message;
    }
}

Error del compilador:

myMac:solidity admin$ solc Test.sol
Test.sol:21:2: Error: Identifier already declared.
    function ownerInfo() public view returns (string) {
 ^ (Relevant source part starts here and spans across multiple lines).
Test.sol:9:2: The previous declaration is here:
    string ownerInfo = "Contract Owner name XYZ";
    ^------------------------------------------^

No veo ninguna declaración duplicadaownerInfo de . ¿Alguna idea, por qué me sale este error?

Respuestas (2)

La respuesta de @Hari GTT Psicolabis es correcta, pero eso significa que debe especificar el ownerInfocampo publicpara obtener el beneficio de un captador público.

string public ownerInfo = "Contract Owner name XYZ";

la alternativa es cambiar el nombre de su función.

Tienes razón, no sé por qué pensé que ya era público.
¡Olvidé cambiar el nombre del método a 'getOwnerName'! Y feliz de conocer información adicional sobre 'captadores generados automáticamente' en Solidity. @mirg, Cambiar el nombre solo funciona : string ownerInfo = "x"; function getOwnerInfo() public view returns (string) { return ownerInfo; }. @hari-gtt-psicolabis, ¡Gracias! Simplemente declarando variable como publictambién funciona: string public ownerInfo = "x"; function ownerInfo() public view returns (string) { return ownerInfo; }. Acepté la respuesta de @mirg, ya que exponer el atributo como 'público' no es una solución deseada. Pero, he votado a favor :-)

Esto se debe a que el método y la propiedad tienen el mismo nombre. Dado que solidity crea automáticamente una función captadora pública para cada variable pública en el contrato, no necesitafunction ownerInfo() public view returns (string)