我正在做一个ASP.NET Blazor服务器项目,.NET 6(LTS)。在之前的VS 2022版本中(甚至在17.4.4到17.5.* 之前),一切都很好,但新的更新到17.6.1破坏了代码:项目将不再编译。我在不同的计算机和VS 2022版本中复制并测试了完全相同的代码。
看起来是这样的:第一个Bug是由MyParent=this
创建的,它使父给予自己的示例作为参数提供给子对象。(这个技巧经常在例子中使用,在以前的版本中也是如此。)这将创建前两行错误(CS 0400和CS1503)。
当将子组件 Package 到 Package 器中时,这将创建CS 1662错误。
删除所有传入参数后,项目即可编译。
@*this compiles*@
<Wrapper>
<Child></Child>
</Wrapper>
我还成功地在默认的Blazor服务器模板中重新创建了(两个)错误。
Parent.razor:
@page "/parent"
<h3>Parent</h3>
<div>
<h6>This will create both bugs:</h6>
<p>"namespace bug" (CS0400 and CS1503)</p>
<p>"lambda expression bug"(CS1662)</p>
<Wrapper>
<Child MyParent=this></Child>
</Wrapper>
@*
alt version (longer)
<Wrapper Context="MyContext">
<Child MyParent=this MyObj=MyContext.MyData></Child>
</Wrapper>
*@
</div>
@*
<!-- the followling block would create only the first bug (with two errors). to see this, comment out the block above.-->
<div>
<h6>This will create only the first ("namespace") bug:</h6>
<p>"namespace bug" (CS0400 and CS1503)</p>
<Child MyParent=this></Child>
</div>
*@
@code {
public string MyName { get; set; } = "I am the parent.";
}
Wrapper.razor:
@using VS17._6._1BUG_Test.Data;
<h3>Wrapper</h3>
@code {
[Parameter]
public RenderFragment<MyClass> ChildContent { get; set; }
}
Child.razor:
<h3>Child2</h3>
<h6>my text:</h6>
<p>
@MyObj.ToString()
</p>
<h6>parent data:</h6>
<p>@MyParent.MyName</p>
@code {
[Parameter]
public object MyObj { get; set; }
[Parameter]
public Parent MyParent { get; set; }
}
MyClass.cs:
namespace VS17._6._1BUG_Test.Data
{
public class MyClass
{
public object MyData { get; set; } = "default data";
}
}
整个代码可以在Github上找到
我希望微软能及时修复bug。如果任何人有任何其他建议,也欢迎。如果这个问题持续下去,我可能会考虑将VS 2022降级到17.5,尽管这似乎是我的最后手段,也可能有点困难。即使是一个完整的重新安装到一个较早的版本,如果可能有点复杂,因为我不认为这可以很容易地完成与VS安装程序。
更新:
我注意到,VS-installer现在实际上提供了一个回滚到以前版本的选项。所以我犹豫是否要更新到17.6.2来测试它是否被修复了(然后我只能回滚到17.6.1),但我现在可能会回滚到17.5。
更新:
似乎在预览版17.7.0预览版1中,这个错误不再出现,尽管我在发行说明中没有找到具体的修复方法(没有搜索太深)。
1条答案
按热度按时间70gysomp1#
我在使用Visual Studio时也遇到了同样的问题--我的代码在15.X上工作,在16.X上不工作。我设法追踪到一个带有泛型参数的razor基类:
ElementBase.razor
因为这是一个基类,所以它没有定义任何标记--它定义的任何东西都会被子类覆盖。我把它改为一个普通的C#类,错误就消失了: