我有以下代码:
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 {}行上。为什么编译器会假定显式声明的类型是另一个?
答案 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构造函数。
要么允许项目编译。