我有以下代碼,我想向下轉換到具有泛型的介面,但出現運行時例外:無法將“FinalAssociator”型別的物件轉換為“IAssociator`1[Common]”。
public interface ICommon
{
string Name {get;set;}
}
public class Common : ICommon
{
public string Name {get;set;}
}
public class FinalCommon : Common {}
public interface IAssociator<T> where T : ICommon
{
void HandleEvent(T data);
}
public abstract class Associator<T> : IAssociator<T> where T : ICommon
{
public abstract void HandleAnotherEvent(T data);
public void HandleEvent(T data)
{
HandleAnotherEvent(data);
}
}
public class FinalAssociator : Associator<FinalCommon>
{
public override void HandleAnotherEvent(FinalCommon data)
{
Console.WriteLine(data.Name);
}
}
var x = new FinalAssociator();
var y = new FinalCommon { Name = "John" };
var z = (IAssociator<Common>)x;
z.HandleEvent(y);
uj5u.com熱心網友回復:
你不能這樣做,因為它可能由于無效型別而導致運行時錯誤,這是泛型旨在防止的事情之一。考慮如果編譯器允許您的代碼會發生什么。你有:
z.HandleEvent(y);
這y是 的一個實體FinalCommon,它不會出現問題。但是,如果您改為傳入其他內容,例如:
z.HandleEvent(new Common());
這將導致您傳遞一個不FinalCommon屬于您的方法的實體,而該實體肯定需要FinalCommon. 這是非法的,編譯器會阻止您進入這種情況。
uj5u.com熱心網友回復:
FinalAssociatior繼承自Associator<FinalCommon>. 它的HandleAnotherEvent方法需要一個型別為 的引數FinalCommon。
如果您可以將它的實體轉換為 asIAssociator<Common>那么您就可以將型別引數傳遞Common給它,即使該類需要FinalCommon.
var finalAssociator = new FinalAssociator();
var commonAssociator = (IAssociator<Common>)finalAssociator; // can't do this
// You'd be able to do this because the interface allows it, but it doesn't
// make sense because the object is a FinalAssociator
// and it doesn't take this argument.
commonAssociator.HandleAnotherEvent(new Common());
正如所寫,編譯器無法確定這是無效的,這就是您收到運行時錯誤的原因。(Resharper 提供警告,這可能會在運行時失敗。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/396643.html
上一篇:利用python進行nc轉tif的三種情況的解決辦法
下一篇:使用泛型型別不匹配
