'namespace used like a type' error

2020-06-08 14:12发布

问题:

Coders, I am trying to convert a XAML string to HTML using a library I found here , but I have a problem with creating a new instance of the object that would let me use the library. I already added a reference to the library in my Asp.net project and I would like to use it in a WCF file.

The problem is that whenever I try to instantiate a new object with the new keyword, I get an error that says:

'MarkupConverter' is a 'namespace' but is used like a 'type'.

Here is my code, notice that I am creating a new object just like the example shown in the library link above, please help:

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;
        }
    }
}

回答1:

Confusion is arising because the actual type is MarkupConverter.MarkupConverter, the compiler seems to think your new MarkupConverter is an attempt to use a namespace as a type, rather than an attempt to instantiate a type inside your using namespace.

Simply change your problem line to:

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

..and you should be fine.



回答2:

In your case, you have a namespace MarkupConverter and a class with the same name (MarkupConverter again).

In the line markupConverter = new MarkupConverter(); /*PROBLEM IS HERE*/ the compiler is unable to tell that you intent to use the class. Since a namespace with the same name is present, the compiler picks it instead, because namespaces are linked with higher priority by the compiler.

You can resolve this by using the complete name of the class:

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

An alternative way to providing the fully-qualified name of the class is to use an alias, which takes the form of using {ALIAS} = {Fully qualified name of Type| Namespace}. Note that the {ALIAS} part can be any valid identifier.

The alias you can place either in your usings:

using System.Net.Mail;
using System.ServiceModel.Activation;
using System.Data.SqlClient;
using MarkupConverter;

using MarkupConverter = MarkupConverter.MarkupConverter; // this is aliasing

or after the namespace declaration:

using System.Data.SqlClient;
using MarkupConverter;

namespace AspPersonalWebsite
{
    using MarkupConverter = MarkupConverter.MarkupConverter;

    ....

and you're good to go! At this point, if aliases are present, the line

markupConverter = new MarkupConverter()

will correctly pick the MarkupConverter class, because explicit aliasing has higher priority than the automatic binding done by the compiler.



回答3:

That is pretty much self explanatory,

MarkupConverter is a namespace ,so shouldn't be used as a class to create an object



回答4:

Can you show the MarkupConverter class you use please? The error is maybe in its declaration. In Where namespace is it? What is your file structure?

Maybe you have created a MarkupConverter namespace?



回答5:

You should add a "using MarkupConverter" statement in the usings section. That will import all classes from that namespace.