2017-04-20 16 views
0
public abstract class BusinessObject : ObservableObject, IBusinessObject 
public abstract class BusinessModel<T> : IBusinessModel<T> where T : IBusinessObject 
public class User : BusinessObject 
public class UserModel : BusinessModel<User> 

UserModelをIBusinessModel < IBusinessObjectにキャストできないのはなぜですか?c#汎用インターフェースのキャスト

+0

クラスには分散がないため、共分散と反共を調べる。これは確かに重複している、私は誰かがこれを閉じるために一致する質問を見つけることを願っています。 – dasblinkenlight

+1

質問にIBusinessModelまたはIBusinessObjectの定義がないため、誰が知っていますか? (しかしおそらく、 'User'は常に' BusinessObject'ですが、 'BusinessObject'は' User'ではないかもしれないし、 'UserModel'は' BusinessObject'ではなく 'User'を望んでいるかもしれないからです) – Tibrogargan

+0

何百もありますStack Overflowに関する質問は、あなたが何を求めているのかをすでに尋ねています。「どうして私のオブジェクトを何かに投げ込めないのですか?最も初期の例の1つは、重複したマークを参照してください。これには、あなたがしたいと考えるものは、実際には安全ではなく、あなたのコードが行うことができるものではないという理由で、いくつかの議論が含まれています。 –

答えて

0

あなたはこのようIBusinessModel共変を定義する必要があります。

public interface IBusinessModel<out T> 
{ 
//... 
} 

それが動作します。

共分散
最初に指定したよりも派生型を使用できるようにします。

いつもと同じように、メインreferenceを参照すると完全な説明が得られます。 OPの例に基づいて


さらなる説明:
同じページに取得するには、

abstract class BusinessObject : ObservableObject, IBusinessObject { } 
class ObservableObject { } 
interface IBusinessObject { } 
abstract class BusinessModel<T> : IBusinessModel<T> where T : IBusinessObject { } 
interface IBusinessModel<out T> { } //This change should be made as suggested in my answer 
class User : BusinessObject { } 
class UserModel : BusinessModel<User> { } 
のは、最初の(宣言のいくつかは疑問で提示されていないとして)私たちはクラスやインタフェースのためにこれらの定義を持っていると仮定しましょう

今、次の課題はどうなりますか?

IBusinessModel<IBusinessObject> v = new UserModel(); 
  1. BusinessObject(即ちUser)のサブクラスであるIBusinessObjectの実装は、IBusinessObjectの代わりに使用されています。
  2. IBusinessModelの代わりにIBusinessModel(つまりBusinessModel)の実装が使用されます。

我々はすでに我々がBusinessModelの番目の定義でIBusinessObjectの任意のインスタンスを使用することができると述べているので、1が何らかの問題が発生しない場合:(

abstract class BusinessModel<T> : IBusinessModel<T> where T : IBusinessObject { } 

2が反変であることをIBusinessModelを必要とする場合前に引用した定義に基づく):

interface IBusinessModel<out T> { } //This change should be made as suggested in my answer 
関連する問題