に変換することは可能ですかClass<T> Where T : IMySampleInterface
?Class<IMySampleInterface>
例:
public abstract class AbstractCommunication: ICommunication
{
private ICommunicationCallback<ICommunication> callback = null;
public void registerCommunicationCallback<T>(ICommunicationCallback<T> callback) where T : ICommunication
{
this.callback = (ICommunicationCallback<ICommunication>)callback; //<--DOESNT WORK
}
}
私の例では、次の例外が発生します。System.InvalidCastException
編集:
public interface ICommunicationCallback<T> where T : ICommunication
{
void onCommunicationCallback(T sender, String data);
}
なぜこの方法を使用するのか: たとえば 2 つのコールバックを実装する必要がある基本クラスがある場合は、次のように単純に使用できます。
public class TestClass : ICommunicationCallback<TestClass1>, ICommunicationCallback<TestClass2>
TestClass1:
public class TestClass1: AbstractCommunication
{
}
TestClass2:
public class TestClass2: AbstractCommunication
{
}
編集:「Tが常にICommunicationである場合、なぜそれを一般的なままにするのですか? – Davin Tryon 20分前」Im lock at this point
わかりましたジェネリックなしで、同じエラーが発生しましたが、異なりSystem.InvalidCastException
ます:(それが、最初にジェネリックを使用した理由です-今覚えています)
public class DocumentTest : ICommunicationCallback<GetDocumentData>
{
public void callAsync()
{
CommunicationFactory comFactory = new CommunicationFactory(communicationServiceClient);
GetDocumentData getDocumentData = (GetDocumentData)comFactory.createCommunicationObject(CommunicationFactory.ENTITY_TYPE.GET_DOCUMENT_DATA,(ICommunicationCallback<ICommunication> ) this);
}
}
public interface ICommunicationCallback<ICommunication>
{
void onCommunicationCallback(ICommunication sender, String data);
}
私の場合、ジェネリックを使用することが唯一の解決策だと思います-「この機能はジェネリック インターフェイスとデリゲートに対してのみ機能します。バリアント ジェネリック インターフェイスを実装する場合、実装クラスは依然として不変です。クラスと構造体は C# 4.0 のバリアンスをサポートしていません。 . したがって、次のコードはコンパイルされません: // List は共変インターフェイスを実装します // IEnumerable. しかし、クラスは不変です. List list = new List(); // ここでコンパイラ エラーが発生します." ( http://blogs.msdn.com/b/csharpfaq/archive/2010/02/16/covariance-and-contravariance-faq.aspx )