根據標題,是否可以在c#4中聲明類型 - 否定約束?generic NOT constraint where T:!IEnumerable
回答
不 - 在C#或CLR中都沒有這樣的概念。
這個概念將來會用於C#和/或CLR嗎? – 2015-07-16 14:25:05
@RandRandom:我還沒有聽說過任何計劃。 – 2015-07-16 14:25:47
沒有,但它是可以檢查與「是」,然後處理它適當地...
您使用的約束,這樣可以保證你使用的類型有一定的屬性/方法/ .. 你想用。
帶類型否定約束的泛型沒有任何意義,因爲沒有任何目的可以知道不想使用某些屬性/方法。
顯然你還沒有收到錯誤:##'
我可以通過使用一系列實現類似接口實例的抽象類來解決我的場景,並繼承抽象類..我想那就是Action
據我所知,這是不可能的。
你可以做的是一些運行時檢查:
public bool MyGenericMethod<T>()
{
// if (T is IEnumerable) // don't do this
if (typeof(T).GetInterface("IEnumerable") == null)
return false;
// ...
return true;
}
你不能像'那樣使用' - 它測試一個* object *是否與一個類型兼容。 – 2012-01-04 13:32:27
你的意思是if(typeof(T)== typeof(IEnumerable)){}' – kev 2012-01-04 13:53:43
一個使用了這將是一個選項類型。
public class Option<A,B>
where A : !B
where B : !A
{
private readonly A a;
private readonly B b;
private Option(){}
public Option(A a)
{
this.a = a
}
public Option(B b)
{
this.b = b
}
}
運行時檢查當然會起作用,但是在編譯時你沒有類型檢查的好處。
我發現我自己想實現在評論中提到的相同的情況下:
void doIt<T>(IEnumerable<T> what) { }
void doIt<T>(T whats) { }
我除外下面的代碼來引用第一種方法:
doIt(new List<T>());
但它實際上引用第二個。
一種解決方案是投的說法是這樣的:
doIt(new List<T>().AsEnumerable<T>());
演員可以通過另一個重載隱藏:
void doIt<T>(List<T> whats) {
doIt(whats.AsEnumerable<T>());
}
- 1. Generic DBContext for Where Query
- 2. 無法從IEnumerable <T>轉換爲IEnumerable <T>
- 3. Generic <T>()vs Generic(System.Type)。泛型VS反射
- 4. SqlDataReader IEnumerable <T>
- 5. 從IEnumerable <T>
- 6. 轉換/投射IEnumerable到IEnumerable <T>
- 7. 從IEnumerable <IEnumerable <T>>
- 8. IEnumerable <IEnumerable <T>> to string [] []
- 9. 如何將IEnumerable <IEnumerable <T>>轉換爲IEnumerable <T>
- 10. IEnumerable的<IEnumerable的<T>>到的IEnumerable <T>使用LINQ
- 11. 的EntitySet <IEnumerable的<T>>到IEnumerable的<T>
- 12. IEnumerable的<T>到的IDictionary <U,IEnumerable的<T>>
- 13. 選擇自IEnumerable <T>到IEnumerable的<Quantity<T>>
- 14. IEnumerable <T>代表IEnumerable的「其餘」<T>序列
- 15. 爲什麼ICollection <T>實現IEnumerable <T>和IEnumerable
- 16. Linq返回IEnumerable <T>
- 17. 不懂IEnumerable <T>
- 18. C#DAL returing generic列表<T>
- 19. C#,objectCollection.OfType <T>()和foreach(T item in objectCollection),IEnumerable to IEnumerable <T>
- 20. IEnumerable <T> .Union(IEnumerable <T>)覆蓋的內容而不是工會
- 21. Lambda Expression + IEnumerable + C#+ Where + Contains
- 22. 委託方法參數從IEnumerable <T>到特定類型
- 23. C#的IEnumerable上<T>
- 24. IEnumerable的<T>轉換
- 25. XML到IEnumerable的<T>
- 26. DataTables vs IEnumerable <T>
- 27. IEnumerable.GetEnumerator()和IEnumerable <T> .GetEnumerator()
- 28. IEnumerable的<T>問題
- 29. IEnumerable的<T>過濾
- 30. 與發送列表<T>爲IEnumerable <T>的方法
即使有,你可以描述一個用例? – 2012-01-04 13:18:06
觀察你有這樣的要求是很奇怪的。您只能針對您認爲屬於班級家庭的類型T進行編碼。你怎麼能用泛型編碼呢?要麼在這種情況下不需要泛型,要麼需要修改用例。 – 2012-01-04 13:46:43
感興趣的用例是允許以下重載並存:void void doIt(T what){} void doIt (IEnumerable whats){} - 目前存在歧義,因爲'T '在第一個方法可能是'IEnumerable <>'(所以我想指定'T'不應該是'IEnumerable')... –
Cel
2012-01-04 14:14:22