3 回答

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

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);

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