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

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

為什么C#泛型不能像C ++模板那樣從其中一個泛型類型參數派生出來?

為什么C#泛型不能像C ++模板那樣從其中一個泛型類型參數派生出來?

蝴蝶刀刀 2019-11-18 14:19:20
為什么C#泛型不能像C ++模板那樣從其中一個泛型類型參數派生出來?我的意思是我知道這是不可能的,因為CLR不支持此功能,但是為什么呢?我知道C ++模板和C#泛型之間的深刻區別-前者是編譯時實體,必須在編譯期間解決,而后者是一流的運行時實體。但是,我仍然看不到CLR設計者沒有提出最終使CLR泛型類型從其泛型類型參數之一派生的方案的原因。畢竟,這將是非常有用的功能,我個人非常想念它。編輯:我想知道一個核心問題,即解決該問題會在實施此功能時產生高昂的代價,因此尚無法實施。例如,檢查以下虛構聲明:class C<T> : T{}正如埃里克·利珀特(Eric Lippert)所注意到的,如果“ 如果T是一個結構,該怎么辦?如果T是一個密封的類類型,該怎么辦?如果T是一個接口類型,該怎么辦?如果T是C,該怎么辦?!如果T是從C派生的類,該怎么辦?如果T是具有抽象方法的抽象類型;如果T具有比C少的可訪問性,該怎么辦?如果T是System.ValueType,該怎么辦?(您可以有一個繼承自System.ValueType的非結構嗎?)關于System.Delegate, System.Enum,依此類推? ”正如埃里克(Eric)繼續所說的那樣,“ 那些是容易的,顯而易見的 ”。的確,他是對的。我對一些既不容易也不明顯的問題的具體例子感興趣,這很難解決。
查看完整描述

3 回答

?
胡說叔叔

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

好吧,首先問問自己可能有什么問題class C<T> : T { }。立刻想到了很多事情:

如果T是一個結構怎么辦?如果T是密封類類型怎么辦?如果T是接口類型怎么辦?如果T是C<T>?如果T是從中派生的類C<T>怎么辦?如果T是具有抽象方法的抽象類型怎么辦?如果T具有比C少的可訪問性怎么辦?如果T是System.ValueType怎么辦?(您可以有一個繼承自System.ValueType的非結構嗎?)System.Delegate,System.Enum等如何?

這些是簡單,顯而易見的。提議的功能實際上打開了數百個(如果不是數千個)關于類型與其基類型之間的交互的更微妙的問題,所有這些問題都必須仔細指定,實現和測試。毫無疑問,我們會錯過某些內容,從而在將來造成重大更改,或者使運行時受實現定義的行為約束。

成本將是巨大的,因此收益最好是巨大的。我在這里沒有看到巨大的好處。


查看完整回答
反對 回復 2019-11-18
?
慕碼人2483693

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

好吧,如果您不喜歡我以前的回答,那么讓我們采取另一種方法。

你的問題的先決條件是謊言:我們需要一個理由執行一個功能。相反,我們需要一個非常非常好的理由來實現任何功能。功能的前期成本,維護成本和機會成本非常昂貴。(也就是說,您花在功能X上的時間就是您不能花在執行功能Y上的時間,這可能會阻止您執行功能Z。)為了負責任地為我們的客戶和利益相關者提供價值,我們無法實施所有功能有人碰巧喜歡

不能由運行時設計者來證明為什么他們沒有實現您認為特別好的功能。根據功能的成本和對用戶的好處來對功能進行優先級排序,并且用戶并沒有完全要求我進行此類繼承。這個特殊功能將極大地改變類型系統的分析在運行時的工作方式,對使用泛型的每種語言產生深遠的影響,并且對我來說幾乎沒有好處。

我們在用C ++編寫的編譯器中使用這種繼承,并且所生成的代碼難以理解,難以維護且難以調試。我一直在盡力逐步消除這樣的代碼。我反對在C#中啟用相同類型的錯誤模式,除非這樣做具有巨大的吸引力。

以令人信服的方式描述巨大利益的任務是由想要該功能的人員而不是必須實施該功能的人員承擔。那么,什么是引人注目的收益?


查看完整回答
反對 回復 2019-11-18
?
HUX布斯

TA貢獻1876條經驗 獲得超6個贊

可以幫助的代碼示例:


public class SpecialDataRow<T> : T where T : DataRow

{

    public int SpecialFactor { get; set; }

}

這將使您能夠從DataRow以及任何派生的DataRows(如鍵入的數據集生成的數據行)中創建“特殊”行


我沒有看到其他方式如何編碼這樣的類


查看完整回答
反對 回復 2019-11-18
  • 3 回答
  • 0 關注
  • 785 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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