では、単一の型パラメーターに対して両方をサポートできないのはなぜでしょうか?
型パラメーターが出力セーフである場合、インターフェイスはその型パラメーターでのみ共変であり、型パラメーターが入力セーフである場合、インターフェイスは型パラメーターでのみ反変であることに注意してください。
構文out T
は、それT
が共変型パラメーターであることを示しています。
構文in T
は、それT
が反変型パラメーターであることを示しています。
共変型パラメーターであるためT
、定義上、入力に対して安全ではありません。
反変の型パラメーターであるためT
、定義上、出力に対して安全ではありません。
したがって、T
は入力が安全ではなく、出力が安全ではありません。
したがって、T
入力位置でT
は禁止され、出力位置では禁止されます。
したがって、T
インターフェイスで指定されたメソッドの入力位置にも出力位置にも表示できません。
したがって、T
インターフェイスではまったく使用できず、型パラメーターとしては無意味です。したがって、言語設計者は、見苦しいものを避けるために、共変と反変の両方としてマークされたそのような役に立たない型をインターフェイスに含めることさえ禁止しています
interface IFoo<in and out T> { }
Foo<T> : IFoo<T> { }
その後:
IFoo<Cat> cat = (IFoo<Animal>)new Foo<Dog>();
(入力セーフと出力セーフについて調べる必要がある場合は、言語仕様の 13.1.3.1 を参照してください。)