Solidity-Compiler - Fehler: Bezeichner bereits deklariert

Vollständiger Quellcode der Datei '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;
    }
}

Compiler-Fehler:

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";
    ^------------------------------------------^

Ich sehe keine doppelte Deklaration von ownerInfo. Irgendeine Idee, warum erhalte ich diesen Fehler?

Antworten (2)

Die Antwort von @Hari GTT Psicolabis ist richtig, aber das bedeutet, dass Sie das ownerInfoFeld so angeben müssen, dass Sie publicvon einem öffentlichen Getter profitieren.

string public ownerInfo = "Contract Owner name XYZ";

Die Alternative besteht darin, den Namen Ihrer Funktion zu ändern.

Du hast Recht, ich weiß nicht, warum ich dachte, es wäre schon öffentlich
Ich habe vergessen, den Methodennamen in 'getOwnerName' zu ändern! Und freuen uns über zusätzliche Informationen zu "automatisch generierten Gettern" in Solidity. @mirg, das Ändern des Namens allein funktioniert : string ownerInfo = "x"; function getOwnerInfo() public view returns (string) { return ownerInfo; }. @hari-gtt-psicolabis, Danke! Nur das Deklarieren von Variablen publicfunktioniert auch: string public ownerInfo = "x"; function ownerInfo() public view returns (string) { return ownerInfo; }. Ich habe die Antwort von @mirg akzeptiert, da das Offenlegen des Attributs als „öffentlich“ keine gewünschte Lösung ist. Habe aber positiv abgestimmt :-)

Dies liegt daran, dass die Methode und die Eigenschaft denselben Namen haben. Da solidity automatisch eine öffentliche Getter-Funktion für jede öffentliche Variable im Vertrag erstellt, brauchen Sie das nichtfunction ownerInfo() public view returns (string)