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

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

請問為什么C#構造函數不能推斷類型?

請問為什么C#構造函數不能推斷類型?

C#
白衣非少年 2019-09-07 11:07:52
為什么C#構造函數不能推斷類型?為什么構造函數不支持類型推斷,就像通用方法一樣?public class MyType<T>{    private readonly T field;    public MyType(T value) { field = value; }}var obj = new MyType(42); // why can't type inference work out that I want a MyType<int>?雖然你可以用工廠類解決這個問題,public class MyTypeFactory{    public static MyType<T> Create<T>(T value)    {       return new MyType<T>(value);    }}var myObj = MyTypeFactory.Create(42);構造函數不支持類型推斷是否存在實際或哲學原因?
查看完整描述

3 回答

?
忽然笑

TA貢獻1806條經驗 獲得超5個贊

有沒有一個哲學上的原因,為什么構造函數不能支持類型推斷?

不,當你有

new Foo(bar)

然后我們可以在范圍內識別所有稱為Foo的類型,而不管通用arity,然后使用修改的方法類型推斷算法對每個類型執行重載解析。然后,我們必須創建一個“更好”算法,該算法確定兩個類型中具有相同名稱但不同通用arity的兩個適用構造函數一個是更好的構造函數。為了保持向后兼容性,非泛型類型的ctor必須始終獲勝。

是否有一個實際的原因,為什么構造函數不能支持類型推斷?

是。即使該功能的好處超過其成本 - 這是相當大的 - 但這還不足以實現功能。這個功能不僅必須是一個凈贏,它必須是一個巨大的凈勝利,相比我們可能投資的所有其他可能的功能。它還必須比花費時間和精力修復bug,性能更好工作,以及我們可以付出努力的其他可能領域。理想情況下,它必須適合發布的“主題”。

此外,正如您正確指出的那樣,通過使用工廠模式,您可以獲得此功能的好處,而無需實際擁有該功能。易于使用的變通方法使得功能實現的可能性降低。

此功能已在很長一段時間內列在可能的功能列表中。它實際上從未在列表中足夠高的地方實現。



查看完整回答
反對 回復 2019-09-10
?
守候你守候我

TA貢獻1802條經驗 獲得超10個贊

public class MyType<T> { 
   private readonly T field; 
   public MyType(T value) { field = value; } }

他們可以,沒有必要再次告訴構造函數“T是什么”,因為你已經在課堂上已經完成了這一點。

還您的工廠是不正確,你需要有public class MyTypeFactory<T>不只是public class MyTypeFactory-除非你聲明里面的工廠MyType

編輯更新:

那么,42是長,短,是int還是其他什么?

假設您有以下內容

class Base{
   public virtual void DoStuff() { Console.WriteLine("Base"); }}class Foo : Base{
   public override void DoStuff() { Console.WriteLine("Foo");  }}

然后你做到了這一點

var c = new Foo();var myType = new MyType(c);

你期望foo被使用,還是base?我們需要告訴編譯器代替使用什么T

當你真的想要打字 base

因此

var myType = new MyType<Base>(c);



查看完整回答
反對 回復 2019-09-10
?
梵蒂岡之花

TA貢獻1900條經驗 獲得超5個贊

泛型類型推斷不能像你希望的那樣對構造函數起作用的主要原因是因為當你聲明的所有類都是“MyType <T>”時,類“MyType”甚至不存在。請記住,同時擁有兩者是合法的:

public class MyType<T> {}

public class MyType {}

兩者都是合法的。如果您確實聲明了兩者,并且它們都聲明了沖突的構造函數,那么您將如何消除語法歧義?



查看完整回答
反對 回復 2019-09-10
  • 3 回答
  • 0 關注
  • 329 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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