C#では静的メンバーにアクセスすることはできません 'インスタンスメンバーだったようです。これは、Javaで一般的なバグ回避:一方「継承型」から「静的メンバー」にアクセスすると便利なのはなぜですか?
Thread t = new Thread(..);
t.sleep(..); //Probably doesn't do what the programmer intended.
を、それあなたが派生型「を介して」静的メンバにアクセスしてみましょうありません。演算子(キャストを書くことからあなたを救う)以外に、これが実際に役に立ちそうなケースは考えられません。実際には、それは積極的のような過ち奨励:;私は、エディタでBinaryExpression.
を打つ私は式ツリーをオフに始まる覚えて(不慣れなAPIを介して自分の道を探していたときに
// Nasty surprises ahead - won't throw; does something unintended:
// Creates a HttpWebRequest instead.
var ftpRequest = FtpWebRequest.Create(@"http://www.stackoverflow.com");
// Something seriously wrong here.
var areRefEqual = Dictionary<string, int>.ReferenceEquals(dict1, dict2);
を私は個人的に何度も同様のエラーを犯し続けますなぜ地球上でIntelliSenseが私にオプションとしてMakeUnary
を提供していたのだろうと思っていた)。私(近視眼)の意見では
、この機能:
- 冗長性を低下させません。 (現在の型の継承された静的メンバーにアクセスする際の演算子やケースを除いて)プログラマは型名を一方向に指定する必要があります。
- 上記のようなバグや誤解を招くようなコードを奨励します。
- C#の静的メソッドは、多態性がある場合は、多様性を示していることをプログラマに示唆するかもしれません。
- (マイナー)再コンパイル時に意図しないリビジョンの可能性がある「サイレント」を導入します。
(IMO、事業者が自らの議論を保証する特殊なケースです。)
C#は、通常、この機能が存在しない理由「ピット成功の」言語、であることを考えると?私はその利点(IDEでいつでも解決できる「発見可能性」以外)を見ることはできませんが、私は多くの問題を抱えています。
または、悪いことに、 'UTF8Encoding.ASCII'。 – SLaks
私はそれがやや誤解を招く可能性があることに同意しますが、継承されたメンバーは派生型*のメンバーとして扱われるという原則と一貫しています。このパターンは、制約付きの型パラメータに対して明示的に*使用しない*ことに注意してください。なぜなら、実際にはかなり誤解を招く可能性があるからです。詳細については、http://blogs.msdn.com/b/ericlippert/archive/2007/06/14/calling-static-methods-on-type-parameters-is-illegal-part-one.aspx を参照してください。 –