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

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

具有泛型參數的擴展方法到泛型類

具有泛型參數的擴展方法到泛型類

C#
皈依舞 2023-04-29 10:26:28
下面的代碼無法編譯: public static class MyExtensions    {        public static Bar<M> Convert<T,M>(this Foo<T> list)        {            return new Bar<M>();        }    }    public class Program    {        static void Main(string[] args)        {            Foo<int> foo = new Foo<int>();            foo.Convert<double>();        }    }我必須明確指定 Foo 的通用類型:foo.Convert<int, double>();如果擴展方法只有一個泛型參數,則無需在方法調用期間指定類型。為什么?我可以創建這樣一個不需要我指定 Foo 參數的擴展方法嗎?
查看完整描述

1 回答

?
蝴蝶不菲

TA貢獻1810條經驗 獲得超4個贊

為什么?


類型參數推斷是全有或全無:您必須在每次方法調用時指定所有類型參數,或不指定任何類型參數。


M無法推斷類型參數,因為它不會出現在參數列表中的任何位置。


幾個選項:


將兩個方法鏈接在一起,以便第一個可以使用類型推斷,第二個可以讓您為 指定類型參數M:


Bar<double> bar = foo.CreateConverter()   // Implicitly CreateConverter<int>

                     .ConvertTo<double>() // Specify that you want a Bar<double>

這將需要一個新的干預類型,例如Converter<T>由 返回CreateConverter。那將有一個常規的實例方法ConvertTo<M>。


M在方法中添加一個類型的參數Convert:


public static Bar<M> Convert<T, M>(this Foo<T> list, M ignored)

...然后您可以將該方法稱為:


Bar<double> bar = foo.Convert(default(double));

無可否認,這有點臭。


不要使用擴展方法,而是在泛型類型中使用常規靜態泛型方法——其中類型和方法都有一個類型參數:


public static class Converters<M>

{

    public static Bar<M> Create<T>(Foo<T> foo) { ... }

}

然后將其調用為:


Bar<double> bar = Converters<double>.Create(foo);

該方法的類型參數可以從 中推斷出來,并且您正在顯式指定類型foo的類型參數。


查看完整回答
反對 回復 2023-04-29
  • 1 回答
  • 0 關注
  • 155 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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