public abstract class Flattenable<T_Id, T_Order> where T_Id : struct, IComparable
where T_Order : IComparable
{
public abstract T_Id ID { get; }
public abstract Nullable<T_Id> Parent_ID { get; }
public abstract T_Order Order { get; }
}
partial class MyObjectClass : Flattenable<int, int>
{
public override int ID => this.My_Id;
public override int? Parent_ID => this.My_ParentId;
public override int Order => this.My_Ordinal;
}
public class FlatTree<T, T_Id, T_Order> where T : Flattenable<T_Id, T_Order>
where T_Id : struct, IComparable
where T_Order : IComparable
{
public FlatTree(IEnumerable<T> list)
{}
//Code using Flattenable .ID, Parent_ID , Order
}
在此代碼中,我有一個抽象類Flattenable來擴展現有類,該類具有使我的方法作業所需的必要屬性。
我的問題是初始化我的物件時,我希望泛型型別具有某種“繼承性”。所以不必檢查泛型型別的MyObjectClass定義Flattenable。
我想要什么var temp = new FlatTree<MyObjectClass>(myList);。用法 :
List<MyObjectClass> myList = GetItems();
var temp = new FlatTree<MyObjectClass,int,int>(myList); // => work
// What I want
var temp = new FlatTree<MyObjectClass>(myList); // => Sub type get sniffed from MyObjectClass.
var temp = new FlatTree(myList); // Sub type get sniffed from Enumerable T
uj5u.com熱心網友回復:
// What I want
var temp = new FlatTree(myList); // Sub type get sniffed from Enumerable T
型別推斷不適用于建構式,因為建構式名稱實際上是您嘗試實體化的物件的型別。
如果您的代碼庫對兩者FlatTree和任何泛型都有現有的類定義,則上述語法將無法解決歧義FlatTree<>;它支持建構式必須顯式指定所有泛型型別以識別正確類的概念。
// What I want
var temp = new FlatTree<MyObjectClass>(myList); // => Sub type get sniffed from MyObjectClass.
即使您沒有處理建構式,目前在 C# 中也不可能進行部分型別推斷。型別推斷無法為您完成部分通用型別。
您必須指定要使用的整個泛型型別集;或者在型別推斷有效的情況下,這意味著您不必指定任何泛型型別。不存在型別推斷僅決議部分泛型型別而不是全部泛型型別的情況。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/375635.html
下一篇:在Sorter類中嚴格使用泛型
