为什么Visual C#2008编译器认为一个显式声明和引用类型是另一个未引用的类型?

时间:2012-03-31 03:46:16

标签: c# compiler-construction types declaration

我有以下代码:

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,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'的引用。

这是在返回关键字的TerrainShader.AmbientColor get {}行上。为什么编译器会假定显式声明的类型是另一个?

3 个答案:

答案 0 :(得分:1)

很可能epAmbient.GetValue会返回'System.Drawing.Color',而不是FVProductions.Base.Color。

答案 1 :(得分:0)

如果您的系统上安装了其他版本的.NET,则可能引用了错误的版本。确保.config文件中的任何引用都与2.0版本匹配,并确保没有将杂散.dll复制到bin文件夹。

答案 2 :(得分:0)

找到它。 FVProductions.Base.Color是基础库中的基类,并且具有接受System.Drawing.Color的构造函数。具有问题代码的项目不引用System.Drawing。使用Color类时,即使没有使用它,也无法链接System.Drawing.Color构造函数。所以,我发现了两个解决方案:

让上层库引用System.Drawing库,即使它不会被使用。

从FVProductions.Base.Color中删除System.Drawing.Color构造函数。

要么允许项目编译。