我做错了什么或是不可能将泛型类指定为泛型方法的约束?
我一直在玩generics和db4o(开源对象数据库),我正在编写一个测试程序(见下面的代码)来存储和检索一些用户定义的泛型集合.
我正在尝试编写一个泛型方法(请参阅下面的GetCollectionFromDb)以从数据库中检索特定类型的集合.不幸的是,下面的代码返回了一行编译器生成的错误:
MyCollection1 collection3 = GetCollectionFromDb(Collection1Name);
错误消息是:
The type 'GenericsTest.MyCollection1'cannot be used as type parameter 'T' in the generic type or method 'GenericsTest.Program.GetCollectionFromDb(string)'. There is no implicit reference conversion from'GenericsTest.MyCollection1' to 'GenericsTest.MyCollectionBase '.
我将不胜感激任何关于我可能做错了什么的建议,或者我如何能够以不同的方式来达到所取得的成果.
using System; using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; using Db4objects.Db4o; namespace GenericsTest { public class Entity1 { public string SomeProperty { get; set; } } public class Entity2 { public string SomeProperty { get; set; } } public abstract class MyCollectionBase: Collection { protected MyCollectionBase() : this("") { } protected MyCollectionBase(string pCollectionName) { CollectionName = pCollectionName; } public string CollectionName { get; set; } } public class MyCollection1 : MyCollectionBase { public MyCollection1(string pCollectionName) : base(pCollectionName) { } public void DoSomeWorkOnCollection1() {} } public class MyCollection2 : MyCollectionBase { public MyCollection2(string pCollectionName) : base(pCollectionName) { } public void DoSomeWorkOnCollection2() { } } public class Program { public static IObjectContainer db = null; public static void Main(string[] args) { const string Collection1Name = "Entity1Collection"; const string Collection2Name = "Entity2Collection"; db = Db4oFactory.OpenFile("Test.db"); Entity1 entity1 = new Entity1(); MyCollection1 collection1 = new MyCollection1(Collection1Name); collection1.Add(entity1); db.Store(collection1); Entity2 entity2 = new Entity2(); MyCollection2 collection2 = new MyCollection2(Collection2Name); collection1.Add(entity1); db.Store(collection2); db.Commit(); db.Close(); db = Db4oFactory.OpenFile("Test.db"); MyCollection1 collection3 = GetCollectionFromDb (Collection1Name); } private static T GetCollectionFromDb (string pCollectionName) where T : MyCollectionBase { IList queryResult = db.Query((T c) => c.CollectionName == pCollectionName); if (queryResult.Count != 0) return queryResult[0]; return null; } } }
Jon Skeet.. 9
您的类型不满足约束.你提供了MyCollection1
哪些来自MyCollection
.但是,这并不意味着它来源于MyCollection
.
也许你想表达对两个类型参数的约束而不是一个:
private static T GetCollectionFromDb(string pCollectionName) where T : MyCollectionBase
然后用:
GetCollectionFromDb(Collection1Name);
如果不能解决问题,请告诉我们原因.
您的类型不满足约束.你提供了MyCollection1
哪些来自MyCollection
.但是,这并不意味着它来源于MyCollection
.
也许你想表达对两个类型参数的约束而不是一个:
private static T GetCollectionFromDb(string pCollectionName) where T : MyCollectionBase
然后用:
GetCollectionFromDb(Collection1Name);
如果不能解决问题,请告诉我们原因.