1

私はしばらくこれと戦ってきましたので、助けていただければ幸いです。これが私がC#.NET4.0で直面しているシナリオです。

public interface ITableBusinessLogicLayerIn<in TTableRecord> : IBusinessLogicLayer
    where TTableRecord : ITableRecord
{
// No definition
}

public interface ITableBusinessLogicLayerOut<out TTableRecord> : IBusinessLogicLayer
    where TTableRecord : ITableRecord
{
// No definition
}

両方のインターフェイスを実装するオブジェクトがあります。コードは正常にコンパイルされます。しかし、実行時に、このオブジェクトを次のようにキャストできます。

(ITableBusinessLogicLayerOut<ITableRecord>)obj

しかし、これとしてではありません:

(ITableBusinessLogicLayerIn<ITableRecord>)obj

これは非常に紛らわしいです、私は私が間違っていることをよくわかりません。誰かが私を正しい方向に向けてください。ありがとう!

4

1 に答える 1

3

共変性(in)を使用すると、特定性の低い型の型パラメーターを持つオブジェクトを、より特異性の高い型の1つにキャストできます。たとえば、文字列を期待する型にオブジェクトを渡すことはできないため、文字列を期待する型をオブジェクトを期待する型にキャストすることはできません。詳細については、こちらを参照してください:http: //msdn.microsoft.com/en-us/library/ee207183%28d=lightweight%29.aspx

次の例を考えます。

class MyTableRecord : ITableRecord { }
ITableBusinessLogicLayerIn<ITableRecord> inA;
ITableBusinessLogicLayerIn<MyTableRecord> inB;
ITableBusinessLogicLayerOut<ITableRecord> outA;
ITableBusinessLogicLayerOut<MyTableRecord> outB;

に割り当てることはできますがinBinAその逆はできません。に割り当てることはできますがoutAoutBその逆はできません。

于 2011-04-08T05:11:53.543 に答える