当我尝试运行以下代码时(两个分开的程序集)
类库.cs
public interface ITest
{
}
程序.cs
using System;
public class TestClass
{
public void Test<T>(T x) where T : ITest { }
}
static class Program
{
static void Main(string[] args)
{
new System.Xml.Serialization.XmlSerializer(typeof(TestClass));
}
}
使用以下命令在 Windows 7 64 位中编译:
c:\Windows\Microsoft.NET\Framework\v2.0.50727\csc /target:library ClassLibrary.cs
c:\Windows\Microsoft.NET\Framework\v2.0.50727\csc /reference:ClassLibrary.dll Program.cs
我得到了这个例外:
System.InvalidOperationException:无法生成临时类(结果 = 1)。错误 CS0012:类型 ITest 在未引用的程序集中定义。您必须添加对程序集 ClassLibrary、Version=0.0.0.0、Culture=neutral、PublicKeyToken=null hinzu 的引用。
在 System.Xml.Serialization.Compiler.Compile(Assembly parent, String ns, XmlSerializerCompilerParameters xmlParameters, Evidence evidence)
at System.Xml.Serialization.TempAssembly.GenerateAssembly(XmlMapping[] xmlMappings, Type[] types, String defaultNamespace, Evidence evidence, System.Xml.Serialization.TempAssembly..ctor(XmlMapping[] xmlMappings, Type[] types, String defaultNamespace, String location, Evidence evidence) 在 System.Xml.Serialization.XmlSerializer.GenerateTempAssembly 的 XmlSerializerCompilerParameters 参数、程序集程序集、哈希表程序集(XmlMapping xmlMapping, Type type, String defaultNamespace) at System.Xml.Serialization.XmlSerializer..ctor(Type type, String defaultNamespace) at Program.Main(String[] args)
从TestClass中删除where T : ITest或根本不使用泛型(例如使用public void Test(ITest x))将防止抛出异常,但我在实际应用程序中需要这个构造。
有人明白为什么 XmlSerializer 无法处理 where 约束吗?