通用方法适用于一个 class 但不适用于另一个,具有相同的界面
Generic method working for one class but not the other, with the same interface
我有两个类
[DataContract]
public class HiveReference : IGUID
{
[BsonId]
[DataMember]
public Guid GUID{ get; set; }
....
}
...
[DataContract]
public class HiveByteChunk : IGUID
{
[DataMember]
[BsonId]
public Guid GUID { get; set; }
...
}
我的界面...
public interface IGUID
{
Guid GUID {get;set;}
}
那我有一个扩展方法...
public static void InsertIfNotExists<T>(this T member) where T: IGUID
{
if (!(member).Exists())
{
member.Insert();
}
}
public static void Insert(this object member)
{
DBHelper.Insert(member);
}
然后我的实现代码...
HiveReference hf = new HiveReference();
hf.InsertIfNotExists();
HiveByteChunk chunk = new HiveByteChunk();
chunk.InsertIfNotExists();
最后一行中断,编译器错误:
Error CS0311
The type 'HiveLibrary.HiveBytes.HiveByteChunk' cannot be used as type parameter 'T' in the generic type or method 'Extensions.InsertIfNotExists<T>(T)'.
There is no implicit reference conversion from 'HiveLibrary.HiveBytes.HiveByteChunk' to 'HiveLibrary.IGUID'.
如果两个类都实现了接口,为什么第一个可以调用扩展,而最后一个不能?我是否遗漏了一些明显的东西?
问题是我在不同的命名空间中有一个重复的接口。一旦我删除它,一切都按预期工作。
我有两个类
[DataContract]
public class HiveReference : IGUID
{
[BsonId]
[DataMember]
public Guid GUID{ get; set; }
....
}
...
[DataContract]
public class HiveByteChunk : IGUID
{
[DataMember]
[BsonId]
public Guid GUID { get; set; }
...
}
我的界面...
public interface IGUID
{
Guid GUID {get;set;}
}
那我有一个扩展方法...
public static void InsertIfNotExists<T>(this T member) where T: IGUID
{
if (!(member).Exists())
{
member.Insert();
}
}
public static void Insert(this object member)
{
DBHelper.Insert(member);
}
然后我的实现代码...
HiveReference hf = new HiveReference();
hf.InsertIfNotExists();
HiveByteChunk chunk = new HiveByteChunk();
chunk.InsertIfNotExists();
最后一行中断,编译器错误:
Error CS0311
The type 'HiveLibrary.HiveBytes.HiveByteChunk' cannot be used as type parameter 'T' in the generic type or method 'Extensions.InsertIfNotExists<T>(T)'.
There is no implicit reference conversion from 'HiveLibrary.HiveBytes.HiveByteChunk' to 'HiveLibrary.IGUID'.
如果两个类都实现了接口,为什么第一个可以调用扩展,而最后一个不能?我是否遗漏了一些明显的东西?
问题是我在不同的命名空间中有一个重复的接口。一旦我删除它,一切都按预期工作。