我遇到了以下問題:
有沒有辦法在 List 中獲取所有實作 IMatcher 介面的類?泛型 TU 不能設定為未知。在 Java 中我們可以使用“?”,但在 C# 中沒有運算子。
public interface IMatcher<T, U>
{
}
class X1: IMatcher<string, string>
{
}
class X2: IMatcher<string, DateTime>
{
}
class Program
{
static void Main(string[] args)
{
List<IMatcher<>> l = new List(); //NOT WORKING
l.add(new X1());
l.add(new X2());
}
}
uj5u.com熱心網友回復:
IMatcher<string, string>并且IMatcher<string, DateTime>就編譯器而言是兩種不同的型別。所以沒有辦法將 X1 和 X2 存盤在同一個串列中。例如,考慮如果介面有一個 property U MyProperty {get;set;},并且你想做l[0].MyProperty什么型別應該是什么?字串還是日期時間?因為它可能是它根本不允許的。
public interface IMatcher {}提供解決方法的一種方法是添加一個IMatcher<T, U>派生自的非通用通用介面。或 a IMatcher<T>,因為 X1 和 X2 都具有相同的 T 引數型別。
你也可以使用 a List<object>,但是你失去了靜態型別。還有dynamic, 但這完全是型別檢查的轉變。
uj5u.com熱心網友回復:
你想要“所有實作 IMatcher 介面的類”。但實際上并沒有IMatchter介面。只有IMatcher<T,U>, 準確地說不是介面。這種表示法是一種快捷方式,編譯器可以從中創建許多不同的介面,如IMatcher<string,string>,IMatcher<string,DateTime>等。
IMatcher<string,string>是與 完全不同的型別,IMatcher<string,DateTime>因此沒有共同的基本型別!如果你想這樣做,你需要一個通用的非泛型基型別。它可能看起來像這樣:X1X2
public interface IMatcher
{
bool Match(object first, object second);
}
public interface IMatcher<T, U> : IMatcher
{
bool Match(T first, U Second);
}
class X1: IMatcher<string, string>
{
public bool Match(object first, object second)
{
return Match((string) first, (string) second);
}
public bool Match(string first, string second)
{
return true;
}
}
class X2: IMatcher<string, DateTime>
{
public bool Match(object first, object second)
{
return Match((string) first, (DateTime) second);
}
public bool Match(string first, DateTime second)
{
return true;
}
}
X1然后您可以將和的實體存盤X2在通用串列中,但是您失去了泛型的優勢。您必須決定這種方法在您的情況下是否有意義。
uj5u.com熱心網友回復:
dynamic如果泛型型別不是值型別,請考慮使用關鍵字
這是一個簡單的例子,它有一個通用介面、3 個具體實作和一個存盤它們的串列:
public interface IVector<out T>
{
T[] Data { get; }
}
public class StrVector : IVector<string>
{
public StrVector(params string[] data)
{
Data=data;
}
public string[] Data { get; }
}
public class IntVector : IVector<int>
{
public IntVector(params int[] data)
{
Data=data;
}
public int[] Data { get; }
}
public class FileVector : IVector<FileInfo>
{
public FileVector(params FileInfo[] data)
{
Data=data;
}
public FileInfo[] Data { get; }
}
static class Program
{
static void Main(string[] args)
{
var dynList = new List<IVector<dynamic>>();
dynList.Add(new StrVector("a", "b", "c"));
dynList.Add(new FileVector(new FileInfo("abc.txt"), new FileInfo("data.xml")));
//dynList.Add(new IntVector(0, 5, 15, 80)); // Error: int is value type
foreach (var item in dynList)
{
Console.WriteLine(string.Join(",", item.Data));
}
//a,b,c
//abc.txt,data.xml
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/457769.html
上一篇:Anylogic創建和呼叫函式對多個變數求和并創建一個累積變數
下一篇:將python變數轉換為字串
