我有一段這樣的代碼:
var senders = new List<MessageSenderBase<object>();
senders.Add(new MessageSender1<MessageType1>())。
其中MessageSender1<MessageType1>是從MessageSenderBase<T>派生的,MessageType1是我定義的另一個類。
現在第二行有錯誤,說CS1503 Argument 1: cannot convert from 'Demo.MessageSender.MessageSender1<Demo.MessageSender.MessageType1>' to 'Demo.MessageSender.MessageSenderBase<object> '
我怎樣才能解決這個問題?
我的設計是,MessageSenderBase<T>將位于我的庫中,而在API級別,用戶可以派生他們自己的發送器類,并指定他們自己想要發送的訊息型別。我想這是可行的,因為object是MessageType1的基類,MessageSenderBase<>是MessageSender1<>的基類。
請幫助,謝謝!
編輯 - 添加MessageSenderBase
public class MessageSender1<MessageType1> 。MessageSenderBase<MessageType1>
{
public override string Topic => "topic1";
public async override任務SendAsync()
{
//...。
}
}
public abstract class MessageSenderBase<T>
{
public abstract string Topic { get; }
public T Deserialize(string json)
{
return JsonConvert.DeserializeObject<T>(json)。
}
public abstract Task SendAsync()。
uj5u.com熱心網友回復:
解決這個問題的一個方法是添加一個新的變數介面,該介面具有MessageSenderBase<T>的 "形狀":
public interface IMessageSender< out T> {
string Topic { get; }
T Deserialize(string json) ;
Task SendAsync()。
}
public abstract class MessageSenderBase<T> 。IMessageSender<T>
{
public abstract string Topic { get; }
public T Deserialize(string json)
{
return JsonConvert.DeserializeObject<T>(json)。
}
public abstract Task SendAsync()。
如果你現在把你的串列做成List<IMessageSender<object>>型別,你可以把AnyMessageSender<AnyReferenceType>放在其中。
var senders = new List<IMessageSender<object> > ();
senders.Add(new MessageSender1<MessageType1>())。
注意,如果MessageSenderBase有一個以T為引數的方法(或者更一般的,在 "輸入位置 "有一個T),你不應該在IMessageSender中包含它,因為如果你這樣做,從MessageSender1<MessageType1>()轉換是不安全的。 MessageType1>轉換為IMessageSender<object>了。想象一下,如果你有:
public interface IMessageSender<。 out T> {
...
void Foo(T someT); //假設這是在MessageSender1實作的。
}
而且你將能夠做到:
var senders = new List<IMessageSender<object> > ();
senders.Add(new MessageSender1<MessageType1>())。
senders[0].Foo("abc"); //讓我們試著給Foo一個字串。
但是senders[0]是一個MessageSender1<MessageType1>物件。MessageSender1<MessageType1>.Foo只接受MessageType1物件,而不是字串!
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/318613.html
標籤:
