【问题标题】:'namespace used like a type' error when converting XAML to HTML“命名空间用作类型”错误
【发布时间】:2011-05-13 07:47:48
【问题描述】:

编码人员,我正在尝试使用我找到的库将 XAML 字符串转换为 HTML here,但是我在创建可以让我使用该库的对象的新实例时遇到问题。我已经在我的 Asp.net 项目中添加了对该库的引用,我想在 WCF 文件中使用它。

问题是,每当我尝试使用 new 关键字实例化一个新对象时,都会收到一条错误消息:

'MarkupConverter' 是一个“命名空间”,但用作“类型”。

这是我的代码,请注意我正在创建一个新对象,就像上面库链接中显示的示例一样,请帮助:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using System.Web.Services;
using System.Net.Mail;
using System.ServiceModel.Activation;
using System.Data.SqlClient;
using MarkupConverter;

namespace AspPersonalWebsite
{
    [ServiceContract(Namespace = "")]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class Service1 //: IService1
    {
        private string connectionString = System.Web.Configuration.WebConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString;
        private IMarkupConverter markupConverter;        

        [OperationContract]
        public string convertXAMLToHTML(string XAMLtext)
        {
            string htmlText = "";
            markupConverter = new MarkupConverter(); /*PROBLEM IS HERE*/
            htmlText = markupConverter.ConvertXamlToHtml(XAMLtext);
            return htmlText;
        }
    }
}

【问题讨论】:

  • 代码块显示不正确!
  • @abatishchev 你是否删除了编辑中的 using 语句……我在帖子未编辑时看到了它们
  • @Eyad 由于类库不是您的,因此更改它可能有点挑战,但通常(实际上总是)我们不应该为类使用相同的名称作为命名空间:Don't Do it。另见this

标签: c# .net compiler-errors


【解决方案1】:

由于实际类型是MarkupConverter.MarkupConverter,因此产生了混淆,编译器似乎认为您的new MarkupConverter 是尝试将命名空间用作类型,而不是尝试在using 命名空间内实例化类型。

只需将您的问题行更改为:

markupConverter = new MarkupConverter.MarkupConverter(); /*SOLUTION HERE!*/

..你应该没事的。

【讨论】:

    【解决方案2】:

    在你的例子中,你有一个命名空间MarkupConverter 和一个同名的类(再次MarkupConverter)。

    markupConverter = new MarkupConverter(); /*PROBLEM IS HERE*/ 行中,编译器无法判断您打算使用该类。由于存在同名的命名空间,因此编译器会选择它,因为命名空间由编译器以更高的优先级链接。

    您可以通过使用类的完整名称来解决此问题:

    // supposedly MarkupConverter is the namespace of the MarkupConverter class
    markupConverter = new MarkupConverter.MarkupConverter();
    

    提供类的完全限定名称的另一种方法是使用别名,其形式为using {ALIAS} = {Fully qualified name of Type| Namespace}。请注意,{ALIAS} 部分可以是任何有效的标识符。

    您可以在 usings 中放置的别名:

    using System.Net.Mail;
    using System.ServiceModel.Activation;
    using System.Data.SqlClient;
    using MarkupConverter;
    
    using MarkupConverter = MarkupConverter.MarkupConverter; // this is aliasing
    

    或在命名空间声明之后:

    using System.Data.SqlClient;
    using MarkupConverter;
    
    namespace AspPersonalWebsite
    {
        using MarkupConverter = MarkupConverter.MarkupConverter;
    
        ....
    

    你可以走了!此时,如果存在别名,则行

    markupConverter = new MarkupConverter()
    

    将正确选择 MarkupConverter 类,因为显式别名的优先级高于编译器完成的自动绑定。

    【讨论】:

    • 第二种解决方案听起来很优雅,但不幸的是我得到了Namespace 'Topns' contains a definition conflicting with alias 'MarkupConverter'。 (Topns 是 MarkupConverter 命名空间之上的顶级命名空间)。
    • 在命名空间中使用别名时,您仍必须在别名中使用完整的类型名称。例如using MarkupConverter = Topns.MarkupConverter.MarkupConverter,其中Topns.MarkupConverter 是包含MarkupConverter 类的命名空间。为了解决编译器的进一步混淆,您还可以使用using MarkupConverter = global::Topns.MarkupConverter.MarkupConverter 通常应很少使用global:: 前缀,但如果您自己的命名空间与引用程序集中的命名空间冲突,它会很有用
    • 我写了using MarkupConverter = global::Topns.MarkupConverter.MarkupConverter; 但随后protected MarkupConverter foo; 编译失败,出现此错误:Namespace 'Topns' contains a definition conflicting with alias 'MarkupConverter'
    • 如果手头没有源代码,这很难让人喘不过气来,但我想到的是,您将 MarkupConverter 别名更改为不同且独特的别名,然后改用它。
    【解决方案3】:

    这几乎是不言自明的,

    MarkupConverter 是一个命名空间,所以不应该作为类来创建对象

    【讨论】:

    • 也许这会给你一些奇怪的徽章。
    【解决方案4】:

    你能展示一下你使用的MarkupConverter 类吗?错误可能在其声明中。在哪里命名空间是它?你的文件结构是什么?

    也许你已经创建了一个MarkupConverter 命名空间?

    【讨论】:

      【解决方案5】:

      您应该在 usings 部分添加“using MarkupConverter”语句。这将从该命名空间导入所有类。

      【讨论】:

      • 我做了,但用户 abatishchev 在编辑我的帖子时已将其删除!
      • abatishchev 似乎恢复了他们的删除。所以这个答案现在有点过时了,我会说?
      猜你喜欢
      • 2013-11-11
      • 1970-01-01
      • 2014-10-02
      • 2013-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多