亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

傳遞帶有約束的泛型類型作為 Type<Constraint>

傳遞帶有約束的泛型類型作為 Type<Constraint>

C#
繁花不似錦 2021-06-04 13:25:29
如果我GenericClass的類型約束為where T : BaseType,為什么我不能將其作為 傳遞GenericClass<BaseType>?class GenericClass<T> where T : BaseType{    void Method()    {        new UtilityClass().Method(this);    }}class UtilityClass{    internal void Method(GenericClass<BaseType> genericClass)    {    }}靜態分析器錯誤:Cannot convert from 'GenericsPoc.GenericClass<T>' to 'GenericsPoc.GenericClass<GenericsPoc.BaseType>'我沒想到這一點,因為UtilityClass<T>在T具有繼承BaseClass。
查看完整描述

2 回答

?
桃花長相依

TA貢獻1860條經驗 獲得超8個贊

您需要進行修改,UtilityClass以便該方法也向下傳遞泛型類型:


internal void Method<T>(GenericClass<T> genericClass) where T: BaseType

{

}


查看完整回答
反對 回復 2021-06-05
?
慕桂英4014372

TA貢獻1871條經驗 獲得超13個贊

這個問題每天都會被問到。再一次!


class Cage<T> where T : Animal

{

  public void Add(T t) { ... }

}

現在你的問題是:為什么這是非法的?


Cage<Animal> cage = new Cage<Gerbil>();

因為這一行是合法的:


cage.Add(new Tiger());

Cage<Animal>有一個方法Add,它需要Animal. ATiger是 anAnimal所以必須是合法的。但這意味著我們只是將老虎放入沙鼠籠中。


由于該行必須是合法的并且會導致類型錯誤,因此其他一些行必須是非法的,現在您知道它是哪一行了。


你想要的特性稱為泛型協方差,它在 C# 中是合法的,當:


泛型類型是接口或委托

可變類型參數是引用類型

接口或委托已被標記為安全的變化。

例如:


IEnumerable<Animal> animals = new List<Tiger>() { new Tiger() };

那是合法的。List<Tiger>implements IEnumerable<Tiger>,它是一個接口并標記為協方差安全,因此可以將其分配給IEnumerable<Animal>。


您會注意到無法將鴨子放入動物序列中,因此無法將鴨子放入老虎序列中。這就是我們如何知道協方差是安全的。


查看完整回答
反對 回復 2021-06-05
  • 2 回答
  • 0 關注
  • 201 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號