Что не так с этим классом? - PullRequest
0 голосов
/ 12 июля 2020

У меня есть класс myClass с методом A(), но когда я пытаюсь вызвать A, он всегда не может его найти, и я не могу понять, почему.

Вот мой code:

class Main
{
    [int]$A
    [string]$B
    [bool]$C
}

class myClass : Main
{
    myClass(){
        $This.A = 1
        $This.B = "Property"
        $This.C = $False
    }

    [void] A([string]$Argument) {
        Write-Host $Argument
        $This.C = $True
    }
}

Я определил класс вот так, а затем сделал:

PS C:\> $Class = [myClass]::New()
PS C:\> $Class.A()
Method invocation failed because [myClass] does not contain a method named 'A'.
At line:1 char:1
+ $Class.A()
+ ~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound

Почему это происходит?

1 Ответ

2 голосов
/ 12 июля 2020

У вас не может быть двух участников с одинаковым именем. Свойство A и метод A имеют одно и то же имя, поэтому возникает ошибка.


В вашем классе есть два члена с тем же именем, [int]$A и [void]A([string]$Argument). Да, один - это свойство ([int]$A), а другой - метод ([void]A([string]$Argument)), и они называются по-разному ($var.A и $var.A()), но они являются членами, которые вы можете видеть из командлета Get-Member, однако, поскольку они оба имеют одинаковое имя, тот, который был определен ранее, будет иметь приоритет над другим, который в данном случае является вашей собственностью, [int]$A

PS C:\Users\Neko> $Test = [myClass]::new()
PS C:\Users\Neko> $Test | Get-Member


   TypeName: myClass

Name        MemberType Definition
----        ---------- ----------
A           Method     void A(string Argument)
Equals      Method     bool Equals(System.Object obj)
GetHashCode Method     int GetHashCode()
GetType     Method     type GetType()
ToString    Method     string ToString()
B           Property   string B {get;set;}
C           Property   bool C {get;set;}

Но если вы измените имя, чтобы они были другими, например

class Main
{
    [int]$A
    [string]$B
    [bool]$C
}

class myClass : Main
{
    myClass(){
        $This.A = 1
        $This.B = "Property"
        $This.C = $False
    }

    [void] AM([string]$Argument) {
        Write-Host $Argument
        $This.C = $True
    }
}

Теперь, если я использую Get-Member, я смогу увидеть метод AM:

PS C:\Users\Neko> $Test = [myClass]::new()
PS C:\Users\Neko> $Test | Get-Member


   TypeName: myClass

Name        MemberType Definition
----        ---------- ----------
AM          Method     void AM(string Argument)
Equals      Method     bool Equals(System.Object obj)
GetHashCode Method     int GetHashCode()
GetType     Method     type GetType()
ToString    Method     string ToString()
A           Property   int A {get;set;}
B           Property   string B {get;set;}
C           Property   bool C {get;set;}

Который, как вы можете видеть в столбце Name, не имеет (), поэтому A и A() не будут различаться в глазах парсера.

Теперь Я могу использовать $test.AM("Argument")

PS C:\Users\Neko> $Test.AM("Argument")
Argument
PS C:\Users\Neko> $Test

A B           C
- -           -
1 Property True

И, как вы можете видеть, он вывел Argument и изменил C на True

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...