共用方式為


放寬班次操作員需求

注意

本文是功能規格。 規格可作為功能的設計檔。 其中包含建議的規格變更,以及功能設計和開發期間所需的資訊。 這些文章會發佈,直到提議的規格變更完成並併併入目前的ECMA規格為止。

功能規格與已完成實作之間可能有一些差異。 這些差異記錄在相關的 語言設計會議(LDM)筆記中

您可以在 規格的文章中深入了解將功能規範導入 C# 語言標準的過程

總結

移位運算符的要求將會放寬,所以右側的運算元不再僅限於 int

動機

使用 int以外的類型時,根據另一個計算的結果進行移位並不罕見,例如根據 leading zero count來移位。 類似 leading zero count 的自然類型與輸入類型(TSelf)相同,因此在許多情況下,這需要您在運算前將該結果轉換為 int,即使該結果已經在有效範圍內也一樣。

在連結庫計劃公開的泛型數學介面中,這可能會造成問題,因為類型不為人知,所以轉換至 int 或甚至正確定義這個過程可能都不可行。

詳細設計

位移運算符

§12.11 應重新措辭,如下所示:

- When declaring an overloaded shift operator, the type of the first operand must always be the class or struct containing the operator declaration,
and the type of the second operand must always be int.
+ When declaring an overloaded shift operator, the type of the first operand must always be the class or struct containing the operator declaration.

也就是說,第一個操作數必須是包含運算符宣告的類別或結構,這個限制仍然存在。 已取消第二個運算元必須是 int 的限制。

二元運算子

•14.10.3 應重新表述,內容如下:

-*  A binary `<<` or `>>` operator must take two parameters, the first of which must have type `T` or `T?` and the second of which must have type `int` or `int?`, and can return any type.
+*  A binary `<<` or `>>` operator must take two parameters, the first of which must have type `T` or `T?`, and can return any type.

也就是說,第一個參數必須是 TT? 的限制仍然存在。 第二個操作數必須是 intint? 的限制已經被移除。

二元運算子重載解析

號目錄 §11.4.5 的第一點應該重新撰寫,內容如下:

  • 決定 X 和作業 Y 所提供的一組候選使用者定義運算子 operator op(x,y)。 集合包含由 X所提供的候選運算符聯集,除非運算符是shift運算元,Y提供的候選運算符,每個運算子都是使用候選使用者定義運算符的規則來決定 。11.4.6。 如果 XY 是相同的類型,或如果 XY 衍生自一般基底類型,則共用候選運算符只會發生在合併集一次。

也就是說,對於移位運算符,可選的運算符僅限於類型 X所提供的運算符。

缺點

使用者將能夠定義未遵循建議指導方針的運算子,例如在 C# 中實作 cout << "string"

替代方案

程式庫所曝光的泛型數學介面可以改為公開具體命名的方法。 這可能會讓程式代碼更難讀取/維護。

泛型數學介面可能需要進行 int 位元移位並執行轉換。 此轉換可能很昂貴,或者可能不可能,取決於涉及的類型。

未解決的問題

是否擔心無法保留為何將第二個操作數限制為int的「意圖」?

設計會議

https://github.com/dotnet/csharplang/blob/main/meetings/2022/LDM-2022-02-09.md