PowerShell类实例化报错:排查无参new重载找不到的原因
PowerShell自定义类构造函数错误:无法找到无参构造函数重载
问题描述
创建TestResult类的对象时出现错误:Cannot find an overload for "new" and the argument count: "0",尽管TestItem类已显式定义无参构造函数,但仍触发该错误。
错误原因
TestResult类的属性名$TestResult与类名完全同名,导致PowerShell在解析类构造函数时发生混淆,无法正确识别无参构造函数的重载。
修复方案
将TestResult类中的同名属性重命名(比如改为$TestItems),避免与类名冲突即可解决问题。
修复后的完整代码
# class definition class TestItem { [bool]$TestResult [string]$Message # 带参构造函数 TestItem([string]$Message, [bool]$TestResult) { $this.Message = $Message $this.TestResult = $TestResult } # 无参构造函数 TestItem() {} # 重写ToString() [string] ToString() { return $this.Message } } # 修复后的TestResult类 class TestResult { [int]$TotalCount [int]$PassedCount [int]$FailedCount # 重命名属性,避免与类名冲突 [System.Collections.Generic.IList[TestItem]]$TestItems # 无参构造函数 TestResult() { $this.TestItems = [System.Collections.Generic.IList[TestItem]]::New() $this.FailedCount = 0 $this.PassedCount = 0 $this.TotalCount = 0 } [void]Failed([string]$Message) { $this.AddResult($Message,$false) } [void]Passed([string]$Message) { $this.AddResult($Message,$true) } [void]AddResult([string]$Message, [bool]$Result) { $testItem = [TestItem]::new($Message, $Result) $this.TotalCount++ if($Result) { $this.PassedCount++ Write-Verbose "[+]Passed $Message" -Verbose } else { $this.FailedCount++ Write-Verbose "[-]Failed $Message" -Verbose } $this.TestItems.Add($testItem) } } $results = [TestResult]::new() $results
补充说明
在PowerShell自定义类中,应避免使用与类名完全相同的属性名,这会干扰PowerShell的构造函数解析逻辑。即使显式定义了构造函数,属性与类名的冲突仍可能导致重载识别错误。
内容的提问来源于stack exchange,提问作者Purclot
相关产品推荐
相关产品推荐

