Как вы говорите компилятору C#, что символ - это тип, а не переменная, если они имеют одно и то же имя?

Если у вас есть локальная переменная с именем, совпадающим с типом, есть ли способ сообщить компилятору, что указанный вами символ является типом или переменной? Например, рассмотрим (и игнорируем все ошибки возврата типа):

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 -> Работы
  • D -> ошибка (без метода Trim())

С более прикладной точки зрения

(вы можете пропустить это, если XSD вам надоедает):

В настоящее время я пытаюсь заставить работать LINQ to XSD. В моем XSD-файле есть такие элементы xs:

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

Где тип 'car' определяется как simpleType, подобный этому
(возможно, еще некоторые ограничения, но это по сути):

<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 ответа

Решение

Вы должны полностью определить пространство имен типа.

Если тип не имеет пространства имен, вы можете добавить к нему префикс global:: (в любом случае в C#).

Вы можете заглянуть в Спецификацию C#, чтобы получить больше информации об этом поведении. Вот начало главы, которая описывает это:

7.3 Поиск членов
Поиск членов - это процесс, посредством которого определяется значение имени в контексте типа. Поиск члена может происходить как часть оценки простого имени (§7.5.2) или доступа к члену (§7.5.4) в выражении. Если простое имя или доступ к члену происходит как простое выражение выражения вызова (§7.5.5.1), говорят, что член вызывается. Если элемент является методом или событием, или если это константа, поле или свойство типа делегата (§15), то элемент считается вызываемым. При поиске члена учитывается не только имя члена, но также число параметров типа, которыми обладает член, и доступность члена. В целях поиска членов универсальные методы и вложенные универсальные типы имеют количество параметров типа, указанных в их соответствующих объявлениях, а все остальные члены имеют нулевые параметры типа.

Другие вопросы по тегам