2017-12-14 3 views
0

と私はその後、私は拡張メソッドを持つ2つのクラスジェネリック一つのクラスのために働く方法が、他ではない、同じインターフェース

[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); 
} 

その後、私の実装コード...

このコンパイラエラーと0
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'. 

両方のクラスがインタフェースを実装している場合、なぜ最初のものは、拡張子を呼び出すことができますが、最後のではないでしょうか?私は明白な何かを欠いていますか

+1

これは実際には不可能です。あなたは確かにあなたの記事にも欠けているものを逃した。 [mcve](問題を再現するために最小限の完全なコードを投稿する)を生成できますか? –

+0

両方のクラスが 'HiveLibrary.IGUID'を実装していますか? –

+0

[DataMember] [BsonId]の順番が違います...両方の上に[DataContract]がありますか? (あなたが...他のものよりも上にある、わかりません) –

答えて

0

問題は、別の名前空間に重複したインターフェイスがあることでした。一度削除すると、すべてが意図どおりに機能しました。

関連する問題