Почему компилятор C # различает эти 2 случая? - PullRequest
8 голосов
/ 28 января 2011

Если у вас есть какое-то свойство, подобное:

using Algebra;

public Algebra.Vector3 Direction
{
    get { return this.direction; }
}

, затем скомпилируйте, а затем измените его на:

using Algebra;

public Vector3 Direction
{
    get { return this.direction; }
}

, похоже, что скомпилированный код отличается между двумя сборками,который я мог видеть, используя Reflector.

Почему компилятор различает два кода?Разве не нужно только видеть, существует ли какой-либо неоднозначный тип во время компиляции, и если нет, скомпилированный код должен быть одинаковым для обоих?Я бы предположил, что скомпилированный код будет использовать полные имена для каждого члена в любое время.

Ответы [ 2 ]

7 голосов
/ 28 января 2011

Я не могу воспроизвести это. Пример кода:

namespace Algebra
{
    public class Vector3 {}
}

namespace Test
{
    using Algebra;

    public class Program
    {
        private Vector3 direction = null;

        public Vector3 Direction1
        {
            get { return direction; }
        }

        public Algebra.Vector3 Direction2
        {
            get { return direction; }
        }
    }
}

Сгенерированный IL для двух свойств абсолютно одинаков, и они выглядят одинаково в отражателе.

Я предполагаю, что у вас на самом деле есть другой класс с именем Vector3 в "глобальном" пространстве имен (или в другом пространстве имен, для которого у вас есть директива using).

Попробуйте навести указатель мыши на имена обоих типов в Visual Studio и посмотрите, что они показывают.

2 голосов
/ 28 января 2011

Вот пример того, что будет генерировать результаты, которые вы наблюдаете. Надеюсь, это прояснит то, что вы просите. Предполагая, что у вас есть

  • отдельная библиотека, содержащая тип Vector3 в пространстве имен Algebra;

  • следующие файлы в вашем проекте:

Файл ①

namespace NotAlgebra
{
    public class Vector3
    {
        // ...
    }
}

Файл ②

using Algebra;

namespace NotAlgebra
{
    public class XYZ
    {
        // Refers to NotAlgebra.Vector3 (defined in File 1 above)
        Vector3 MyProperty1 { get; }

        // Refers to Algebra.Vector3 (defined in the external library)
        Algebra.Vector3 MyProperty2 { get; }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...