是否有可能從另一個泛型中使用泛型引數,并推斷出像這樣使用的用法:
public class TypeA< T2> { }
public class TypeB< T1, T3, T2> where T3 : TypeA<T2> {}。
public class Test
{
public Test()
{
///作業,但有點難看......。
new TypeB<string, TypeA<int>, int>()。
//是否有可能以某種方式從實作的通用泛型中推斷出TypeAType,以便我可以像這樣使用它?
new TypeB<string, TypeA<int>>()。
}
}
uj5u.com熱心網友回復:
簡短的回答是否定的,因為C#不支持 "泛型上的泛型"
。為了解釋這意味著什么,讓我給你看一個更具體的例子:
List<int> list = new List<int>()。
HashSet<int> set = list.To<HashSet<int>>()。
在這里,擴展方法To()是一段神奇的代碼,可以將一種型別的容器轉換成另一種型別的容器。
假設C#支持這一特性,人們會天真地嘗試這樣定義該方法:
public static class EnumerableExtensions {
public static TContainer<TItem> To<TContainer<TItem>>(
this IEnumerable<TItem> source)
where TContainer: IEnumerable {
// magic
}
}
這當然不會被編譯,因為C#不能決議一個本身就是泛型的泛型引數(TContainer<TItem>)。
這整個概念被稱為更高的種類多型性(或更高的種型別別),C#并不支持。不過未來可能會支持,您可以在這個GitHub問題中跟蹤進展。
。有一個名為LanguageExt的Nuget包,它提供了一些更高型別的型別,如果我沒有記錯的話,它所做的事情和你一樣:明確宣告內部型別,以便型別推理能夠使用它。
uj5u.com熱心網友回復:
你可以通過引入另一個型別來接近,這個型別具有相同的名稱,但是約束條件更少。要在這種情況下使用;
public class TypeB<。 T1, T3, T2> where T3 : TypeA<T2> {}。
public class TypeB<T1, T2> : TypeB<T1, TypeA<T2>, T2> {}.
new TypeB<string, int>()。
也可以從AspNetCore.Identity中看到UserStore<...>。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/318637.html
標籤:
下一篇:為什么編譯器給了我這個,不能從CompletableFuture<Object>轉換到CompletableFuture<String>?
