gpt4 book ai didi

c# - 此命名空间冲突是由于 XAML 到 .NET 代码生成中的错误造成的吗?

转载 作者:太空狗 更新时间:2023-10-29 22:01:02 25 4
gpt4 key购买 nike

下面我将描述如何重现我收到的错误。它在 VS 2010、2012 和 2013 中的行为相同。将它分成多个项目很重要,如下所示。

重现错误的步骤:

  1. 创建解决方案。

  2. 创建一个名为 Common 的 C# 类库,其中包含一个名为 Handler.cs 的文件:

    using System;

    namespace Common
    {
    public delegate void Handler(object sender, EventArgs args);
    }
  3. 创建一个名为 MyControlLibrary 的 WPF 用户控件库项目,引用 Common。在其中创建一个名为 MyControl.xaml 的用户控件。

    我的控件.xaml:

    <UserControl x:Class="ControlNamespace.MyControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="300">
    <Grid>

    </Grid>
    </UserControl>

    MyControl.xaml.cs:

    using System.Windows.Controls;
    using Common;

    namespace ControlNamespace
    {
    public partial class MyControl : UserControl
    {
    public MyControl()
    {
    InitializeComponent();
    }

    public event Handler MyEvent;
    }
    }
  4. 创建一个名为 MyWpfApplication 的 WPF 应用程序项目,引用 Common 和 MyControlLibrary。在其中创建 WindowNamespace.Common.cs 以及一个名为 MyWindow.xaml 的窗口。

    WindowNamespace.Common.cs:

    namespace WindowNamespace.Common
    {
    }

    我的窗口.xaml:

    <Window x:Class="WindowNamespace.MyWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:c="clr-namespace:ControlNamespace;assembly=WpfControlLibrary1"
    Title="MyWindow" Height="300" Width="300">
    <Grid>
    <c:MyControl MyEvent="MyControl_MyEvent" />
    </Grid>
    </Window>

    MyWindow.xaml.cs:

    using System;
    using System.Windows;

    namespace WindowNamespace
    {
    public partial class MyWindow : Window
    {
    public MyWindow()
    {
    InitializeComponent();
    }

    void MyControl_MyEvent(object sender, EventArgs args)
    {
    }
    }
    }
  5. 构建解决方案。

您应该收到以下错误,指向 MyWindow.xaml 的第 7 行:

The type or namespace name 'Handler' does not exist in the namespace 'WindowNamespace.Common' (are you missing an assembly reference?)

如果打开为 MyWindow.xaml 生成的 .g.i.cs 文件,您应该在 IComponentConnector.Connect 方法中看到以下内容:

#line 7 "..\..\MyWindow.xaml"
((ControlNamespace.MyControl)(target)).MyEvent += new Common.Handler(this.MyControl_MyEvent);

问题的根源是它试图在 WindowNamespace 中找到 Common.Handler。这可以通过将其生成为来解决:

#line 7 "..\..\MyWindow.xaml"
((ControlNamespace.MyControl)(target)).MyEvent += new global::Common.Handler(this.MyControl_MyEvent);

或者通过在文件顶部添加一个 using:

using Common;

...

#line 7 "..\..\MyWindow.xaml"
((ControlNamespace.MyControl)(target)).MyEvent += new Handler(this.MyControl_MyEvent);

请注意,如果所有这些源文件都捆绑到一个项目中,错误就会消失,因为 .g.i.cs 文件的生成方式不同(即它没有明确地将处理程序添加到事件中)。

这实际上是 XAML->.NET 转换中的错误,还是我做错了什么?

最佳答案

如果您在 MyWpfApplication 中的 WindowNamespace.Common 命名空间声明中重新声明 Handler 委托(delegate)并尝试编译,则有关于发生了什么的线索:

Error   1   Cannot implicitly convert type 'WindowNamespace.Common.Handler' to 'Common.Handler' c:\Dev\YourSolution\MyWpfApplication\MyWindow.xaml  7   63  MyWpfApplication

Common 项目正在声明一个名为“Common”的全局命名空间,您的控件库也在使用它。但是,当您的应用程序显式声明“WindowNamespace.Common”时,它会创建一个本地命名空间,而该命名空间恰好与父控件所在的命名空间相同。这实际上会产生 Visual Studio documentation for Compiler Error CS0433 中描述的歧义问题。 .

将 MyWpfApplication 中的公共(public)命名空间声明更改为“Common”,问题就会消失。

关于c# - 此命名空间冲突是由于 XAML 到 .NET 代码生成中的错误造成的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20558589/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com