28

メソッドをコンパイルできるのに、なぜプロパティでエラーが発生するのですか?

public interface IFoo {}
public interface IBar<out T> where T : IFoo {}

public interface IItem<out T> where T: IFoo
{
    // IEnumerable<IBar<T>> GetList(); // works
    IEnumerable<IBar<T>> ItemList { get; set; } // Error!
}

エラー:

無効な分散:タイプパラメータ「T」は、「UserQuery.IItem<T>.ItemList」で逆変的に有効である必要があります。「T」は共変です。

4

2 に答える 2

39

getプロパティの getter ( ) と setter ( )があるため、コンパイラ エラーが発生しますset。プロパティのゲッターはT出力に を持っているのでout動作しますが、プロパティのセッターは入力に を持っているので修飾子Tが必要です。in

あなたが持っているのでoutTセッターを削除する必要があり、コンパイルされます:

public interface IItem<out T> where T : IFoo
{
    // IEnumerable<IBar<T>> GetList(); // works
    IEnumerable<IBar<T>> ItemList { get; } // also works
}

yourTin一般的な引数の場合、次のように動作します。

public interface IItem<in T> where T : IFoo
{
    IEnumerable<IBar<T>> ItemList { set; } 
}

ただし、両方 ( out,in) を同時に持つことはできないため、getter と setter を持つ co/contravariant プロパティを持つことはできません。

于 2012-09-18T20:42:38.883 に答える
2

セッターは許可されていません。もしそうなら、これを行うことができるからです:

public interface ISubFoo : IFoo { }

IItem<ISubFoo> item = //whatever
item.ItemList = new List<IBar<IFoo>>>();

これは型安全ではありません。

于 2012-09-18T20:52:24.510 に答える