Почему компилятор Visual C # 2008 считает, что один явно объявленный и ссылочный тип является другим не ссылочным? - PullRequest
0 голосов
/ 31 марта 2012

У меня есть следующий код:

namespace FVProductions.Base
{
    public struct Color
    {
        public byte B, G, R, A;

        public Color(float r, float g, float b, float a)
        {
            R = (byte)(Math.Min(1.0f, Math.Max(0.0f, r)) * 255);
            G = (byte)(Math.Min(1.0f, Math.Max(0.0f, g)) * 255);
            B = (byte)(Math.Min(1.0f, Math.Max(0.0f, b)) * 255);
            A = (byte)(Math.Min(1.0f, Math.Max(0.0f, a)) * 255);
        }

        public Color(Vector3 rgb)
            :this(rgb.X,rgb.Y,rgb.Z,1)
        {
        }
    }
}

namespace FVProductions.Base.Graphics
{
    public class ShaderParameter<T>
    {
        private T Value;
        public T GetValue() { return Value; }
    }
}

namespace FVProductions.NewGame
{
    public class TerrainShader : Shader, IFullTextured, IStandardLit
    {
        private ShaderParameter<Vector3> epAmbient;

        public FVProductions.Base.Color AmbientColor
        {
            get { return new FVProductions.Base.Color(epAmbient.GetValue()); }
            set { epAmbient.SetValue(value.ToVector3()); }
        }
    }
}

Тип FVProductions.Base.Color находится в указанной библиотеке. epAmbient.GetValue возвращает Vector3, а FVProductions.Base.Color имеет конструктор с одним параметром Vector3. Проект не ссылается на System.Drawing. Однако компилятор генерирует следующую ошибку:

ошибка CS0012: тип «System.Drawing.Color» определен в сборке, на которую нет ссылок. Необходимо добавить ссылку на сборку «System.Drawing, версия = 2.0.0.0, культура = нейтральная, PublicKeyToken = b03f5f7f11d50a3a».

Это в строке TerrainShader.AmbientColor get {} по ключевому слову return. Почему компилятор может предположить, что явно объявленный тип - это другой?

Ответы [ 3 ]

1 голос
/ 31 марта 2012

Скорее всего, epAmbient.GetValue возвращает «System.Drawing.Color», а не FVProductions.Base.Color, как вы думаете.

0 голосов
/ 31 марта 2012

Нашел это. FVProductions.Base.Color является базовым классом в базовой библиотеке и имеет конструктор, который принимает System.Drawing.Color. Проект с кодом ошибки не ссылается на System.Drawing. При использовании класса Color возникли проблемы с подключением конструктора System.Drawing.Color, хотя он не использовался. Итак, я обнаружил два решения:

Пусть верхняя библиотека ссылается на библиотеку System.Drawing, даже если она не будет использоваться.

Удалите конструктор System.Drawing.Color из FVProductions.Base.Color.

Либо разрешит компиляцию проекта.

0 голосов
/ 31 марта 2012

Если в вашей системе установлена ​​другая версия .NET, возможно, вы ссылаетесь на неправильную версию.Убедитесь, что все ссылки в вашем файле .config соответствуют версии 2.0, а также убедитесь, что в папку bin не скопированы случайные .dll.

...