私がこの取り決めを持っているとしましょう:
public interface ICreatable
{
int CreatedByUserId { get; set; }
}
public class Unicorn : ICreatable
{
public int CreatedByUserId { get; set; }
}
public interface ICrudService<T>
where T : class, ICreatable
{
T DoSomething(T t);
}
public class UnicornService : ICrudService<Unicorn>
{
public Unicorn DoSomething(Unicorn unicorn)
{
var createdByUserId = unicorn.CreatedByUserId;
// ...
return unicorn;
}
}
そして、次のように使用します。
static void Main(string[] args)
{
var unicorn = new Unicorn();
var unicornService = new UnicornService();
unicornService.DoSomething(unicorn);
}
これはうまくいきます。ただし、インターフェイス型として、ジェネリック型と一緒にunicornService
インターフェイス型としてキャストしたいとしましょう。ICrudService
var crudService = unicornService as ICrudService<ICreatable>;
問題が発生しました。これはどのように見えるかです:
unicornService as ICrudService<Unicorn> --> casts is fine
unicornService as ICrudService<ICreatable> --> casts to null
それUnicorn
以来ICreatable
、ICrudService<T> where T: class, ICreatable
これを解決するのに問題はないはずです。私の検索は共分散と反分散に私を導き始めましたが、私はそのレベルで迷子になっています。
crudService
にキャストするにはどうすればよいICrudService<ICreatable>
ですか?
アップデート:
共分散を次のように使用します。
public interface ICrudService<out T>
次に、インテリセンスに「無効な分散: 型パラメーター 'T' は 'ICrudService.DoSomething(T)' で反変的に有効である必要があります。'T' は共変です。」これはどのように作動しますか?