ジェネリック型パラメータの制約を定義するときは、たとえば、先頭にclass()
、末尾にnew()
を置く必要があります。ジェネリックパラメータの制約でいくつかの順序が適用されるのはなぜですか?
なぜ、これはどうして私の制約を任意の順序で入れられないのですか?
class
/struct
最初にnew()
の他に注文に関する制限はありますか?
例:
protected T Clone<T>() where T : class, ICopyable<T>, new()
ジェネリック型パラメータの制約を定義するときは、たとえば、先頭にclass()
、末尾にnew()
を置く必要があります。ジェネリックパラメータの制約でいくつかの順序が適用されるのはなぜですか?
なぜ、これはどうして私の制約を任意の順序で入れられないのですか?
class
/struct
最初にnew()
の他に注文に関する制限はありますか?
例:
protected T Clone<T>() where T : class, ICopyable<T>, new()
その順序が選ばれた理由は特に理由はありません。選択された順序はより一般的なものからより具体的なものへと変わります。
「なぜ注文する必要があるのですか?」という質問は、実装チームとテストチームが、言語によって明白で明白な順序をとることは簡単です。制約はどのような順序であってもかまいませんが、それが私たちを買うのは何ですか?
言語が長いほど、ユーザーに選択肢を与えるたびに悪い選択をする機会が与えられます。 C#の基本的な設計原則は、JavaScriptの基本的な設計原則ではないものが間違って見えるようにし、正しいものにするように強制します。その基本的な設計原則は、「ユーザーが意図したことをやり遂げようとする」というものです。正しいものに制限を加えることによって、の構文 C#では、意味のあるセマンティクスがプログラムでうまく表現されるようになります。
... where T : X, Y
Yが明確であることを意図している
class C : X , Y
または
:私は今日C#の様言語を設計していた場合例えばは、私のようなあいまいな構文を持つことになり方法はありませんインタフェース。 Xですか? Xがインタフェースかクラスかを構文上区別することはできません。このあいまいさは、基底型とインタフェースなどのサイクルを検出するようなことを非常に複雑にします。それがVBであるように、もっと冗長であれば、関係者にとってもっと簡単になるでしょう。
+1決定を下す理由と理由についていくつかの洞察を提供してくれてありがとう。 –
私は、C#が他のほとんどの点でJavaの影響を強く受けているときに、C#が継承を表現し、インタフェースをJavaとは異なって実装することが奇妙であることを常に知っていました。コンパイラの作業が複雑になると言うと、それはさらに奇妙です。 – MgSam
"実装とテストチームで簡単に" ..それは私を驚かせる。小さな文法の実装はおそらく少し簡単ですが、今度は実装とテストのための完全な機能が追加されました:「注文が間違っているときにエラーを生成する」 –
ほとんどの構文に関連する質問と同様に、基本的な答えは仕様でそう言われているからです。 C#5.0仕様(第10.1節)からジェネリック型制約のための次の文法が得られます。5)
型パラメータの制約:
primary-constraint secondary-constraints constructor-constraint primary-constraint , secondary-constraints primary-constraint , constructor-constraint secondary-constraints , constructor-constraint primary-constraint , secondary-constraints , constructor-constraint
主制約:
class-type class struct
二制約:
interface-type type-parameter secondary-constraints , interface-type secondary-constraints , type-parameter
コンストラクタ-制約:
new ( )
エリックリペットは、それがこのように設計された理由を説明するの優れた仕事をしているので、私はその上で詳説することはありません。
背景として、言語仕様では、制約が*主制約、副制約、コンストラクタ制約*の順でなければならないことが示されています。ここで、*主制約*は単純に*クラス*または*構造* *は与えられたインタフェースまたはクラス型であり、*コンストラクタの制約*は単に* new()*です。なぜ彼らはそのように分類され、その秩序を必要とするのかについては、わかりません。おそらく注釈付きの言語仕様は、それにいくらかの光を当てるだろうか? –
面白い、ありがとう。それは私が特に関心を持っている理由です。 –