C#の共分散と

C#の型の変動

  変動は、ユーザー定義の変換が禁止され、参照型をサポートしています。

  • 共分散

  戻り値の型は、サブクラスで置き換えることができる場合、これはサポートの種類である共変

  • 変性

   パラメータの型は、その親に置き換えることができる場合、これはインバータのサポートのタイプです

変動パラメータ

  唯一のインターフェイスとデリゲートは、可変パラメータの種類を持つことができ



  • インバータのパラメータ
  • アウト

    パラメータ共変

public class A
{}
public class B:A

共変

サブクラスは親クラスになります

A b=new B();//协变可正常转换

インバーター

親は、サブクラスになり

B b=new A();//这样会直接报错
B b=(B)(new A());//强制转换

共分散とジェネリック

インバーター

  インスタンス化パラメータを使用すると、通常のオブジェクトを作成したい場合、あなたは一般的なパラメータ上のマーカーに追加する必要があり、一般的なインターフェースの親であるサブクラスであり、

一般的なインタフェースの定義

public interface IUserService<in T>
{
        
}
   

ビジネス層は、インターフェイスを実装定義

 public class UserService: IUserService<A>
{
}

インスタンス化

     static void Main(string[] args)
    {
     IUserService<B> s =new  UserService();
    }

言葉ではない場合は、文句を言うだろう

无法将类型“ConsoleApp6.IServer.UserService”
隐式转换为“ConsoleApp6.IServer.IUserService<B>”。
存在一个显式转换(是否缺少强制转换?)

共変

  インスタンス化パラメータを使用すると、通常のオブジェクトを作成したい場合、あなたは一般的なパラメータ上のマーカーに追加する必要があり、一般的なインターフェースの親であるサブクラスであり、

一般的なインタフェースの定義

public interface IUserService<in T>
{
        
}
   

ビジネス層は、インターフェイスを実装定義

 public class UserService: IUserService<B>
{
}

インスタンス化

     static void Main(string[] args)
    {
     IUserService<A> s =new  UserService();
    }

言葉ではない場合は、文句を言うだろう

无法将类型“ConsoleApp6.IServer.UserService”
隐式转换为“ConsoleApp6.IServer.IUserService<A>”。
存在一个显式转换(是否缺少强制转换?)

おすすめ

転載: www.cnblogs.com/zhengyazhao/p/11760719.html