3 回答

TA貢獻(xiàn)1813條經(jīng)驗 獲得超2個贊
有沒有一個哲學(xué)上的原因,為什么構(gòu)造函數(shù)不能支持類型推斷?
不,當(dāng)你有
new Foo(bar)
然后我們可以在范圍內(nèi)識別所有稱為Foo的類型,而不管通用arity,然后使用修改的方法類型推斷算法對每個類型執(zhí)行重載解析。然后,我們必須創(chuàng)建一個“更好”算法,該算法確定兩個類型中具有相同名稱但不同通用arity的兩個適用構(gòu)造函數(shù)中哪一個是更好的構(gòu)造函數(shù)。為了保持向后兼容性,非泛型類型的ctor必須始終獲勝。
是否有一個實際的原因,為什么構(gòu)造函數(shù)不能支持類型推斷?
是。即使該功能的好處超過其成本 - 這是相當(dāng)大的 - 但這還不足以實現(xiàn)功能。這個功能不僅必須是一個凈贏,它必須是一個巨大的凈勝利,相比我們可能投資的所有其他可能的功能。它還必須比花費時間和精力修復(fù)bug,性能更好工作,以及我們可以付出努力的其他可能領(lǐng)域。理想情況下,它必須適合發(fā)布的“主題”。
此外,正如您正確指出的那樣,通過使用工廠模式,您可以獲得此功能的好處,而無需實際擁有該功能。易于使用的變通方法使得功能實現(xiàn)的可能性降低。
此功能已在很長一段時間內(nèi)列在可能的功能列表中。它實際上從未在列表中足夠高的地方實現(xiàn)。

TA貢獻(xiàn)1799條經(jīng)驗 獲得超6個贊
public class MyType<T> { private readonly T field; public MyType(T value) { field = value; } }
他們可以,沒有必要再次告訴構(gòu)造函數(shù)“T是什么”,因為你已經(jīng)在課堂上已經(jīng)完成了這一點。
還您的工廠是不正確,你需要有public class MyTypeFactory<T>
不只是public class MyTypeFactory
-除非你聲明里面的工廠MyType
類
編輯更新:
那么,42是長,短,是int還是其他什么?
假設(shè)您有以下內(nèi)容
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
當(dāng)你真的想要打字 base
因此
var myType = new MyType<Base>(c);

TA貢獻(xiàn)1799條經(jīng)驗 獲得超9個贊
泛型類型推斷不能像你希望的那樣對構(gòu)造函數(shù)起作用的主要原因是因為當(dāng)你聲明的所有類都是“MyType <T>”時,類“MyType”甚至不存在。請記住,同時擁有兩者是合法的:
public class MyType<T> {}
和
public class MyType {}
兩者都是合法的。如果您確實聲明了兩者,并且它們都聲明了沖突的構(gòu)造函數(shù),那么您將如何消除語法歧義?
- 3 回答
- 0 關(guān)注
- 370 瀏覽
添加回答
舉報