代码之家  ›  专栏  ›  技术社区  ›  Matt Mitchell

当符号共享同一个名称时,如何告诉C编译器它是一个类型而不是变量?

  •  2
  • Matt Mitchell  · 技术社区  · 15 年前

    当您有一个名为与类型相同的局部变量时,是否有任何方法可以告诉编译器您给出的符号是类型或变量?例如,考虑(并忽略所有类型返回错误):

    public class sometype { public static sometype DoSomething() {} }
    
    public string sometype { get { return sometype.DoSomething(); } } //A
    public string sometype { get { return sometype.Trim(); } } //B
    public sometype sometype { get { return sometype.DoSomething(); } } //C
    public sometype sometype { get { return sometype.Trim(); } } //D
    
    • A->错误(无方法dosomething())
    • B>作品
    • C & GT作品
    • D->错误(无方法trim())

    从更适用的角度来看

    (如果XSD让您感到厌烦,您可能希望跳过此步骤):

    我目前正在尝试让linq-to-xsd工作。 在我的xsd文件中,有如下xs:elements:

    <xs:element name="car" type="car">
    

    其中“car”类型定义为这样的简单类型
    (可能还有一些限制,但本质上就是这样):

    <xs:simpleType name="car">
     <xs:restriction base="xs:string" />
    </xs:simpleType>
    

    因此,Linq to XSD自然会生成如下代码:

    public string car {
        get {
            XElement x = this.GetElement(XName.Get("car", ""));
            return XTypedServices.ParseValue<string>(x, XmlSchemaType.GetBuiltInSimpleType(XmlTypeCode.String).Datatype);
        }
        set {
            this.SetElementWithValidation(XName.Get("car", ""), value, "car", car.TypeDefinition);
        }
    }
    

    但由于前面提到的问题,这不会编译。

    2 回复  |  直到 15 年前
        1
  •  5
  •   Drew Noakes    15 年前

    您应该完全限定类型的命名空间。

    如果类型没有命名空间,则可以在其前面加前缀 global:: (不管怎么说)

        2
  •  2
  •   Dzmitry Huba    15 年前

    您可以查看C规范以获得有关此行为的更多信息。下面是描述它的章节的开头:

    7.3成员查找
    成员查找是指 类型上下文中的名称是 确定的。可以进行成员查找 作为评估简单名称的一部分 (_§7.5.2)或成员访问(_§7.5.4) 在表达式中。如果简单的名字 或成员访问发生在 的简单表达式 调用表达式(_§7.5.5.1),即 成员被调用。如果A 成员是方法或事件,或者 是的常量、字段或属性 代表类型(_§15),然后是成员 据说是不请自来的。成员 查找不仅考虑 一个成员,同时也是类型的数目 成员具有的参数以及 成员可以访问。对于 成员查找的目的,通用 方法和嵌套泛型类型具有 类型参数的数目 在各自的 声明和所有其他成员 具有零类型参数。