[解決済み] なぜC#のコンストラクタは型を推論できないのですか?
質問
なぜコンストラクタでは、ジェネリックメソッドと同じように型推論がサポートされないのですか?
public class MyType<T>
{
private readonly T field;
public MyType(T value) { field = value; }
}
var obj = new MyType(42); // why can't type inference work out that I want a MyType<int>?
ファクトリークラスで回避することも可能ですが。
public class MyTypeFactory
{
public static MyType<T> Create<T>(T value)
{
return new MyType<T>(value);
}
}
var myObj = MyTypeFactory.Create(42);
コンストラクタが型推論をサポートできないのは、実用的または哲学的な理由があるのでしょうか?
解決方法は?
<ブロッククオートコンストラクタが型推論をサポートできない哲学的な理由があるのでしょうか?
いいえ。
new Foo(bar)
の場合、総称のアリティに関係なく、スコープ内のFooと呼ばれるすべての型を識別し、修正したメソッド型推論アルゴリズムを用いてそれぞれについてオーバーロードの解決を行うことができます。次に、2つの適用可能なコンストラクタのうちどちらを選択するかを決定する「betterness」アルゴリズムを作成する必要があります。 同じ名前だが総称のアリティが異なる2つの型において がより良いコンストラクタです。後方互換性を維持するために、非属性型の ctor は常に勝たなければなりません。
<ブロッククオートコンストラクタが型推論をサポートできない現実的な理由があるのでしょうか?
はい。たとえその機能の利点がコストを上回るものであっても--それは相当なものですが--、それだけではその機能を実装するには十分ではありません。その機能が正味の利益になるだけでなく、その機能が 大きい 他のすべての可能な機能と比較しての勝利です。また、その時間と労力を、バグフィックスやパフォーマンス作業など、他の可能性のある分野に費やすよりも、優れていなければなりません。そして理想的には、そのリリースの「テーマ」にうまく適合するものでなければなりません。
さらに、あなたが正しく指摘しているように、ファクトリーパターンを使うことで、実際に機能そのものを持たずとも、この機能の利点を得ることができます。簡単な回避策が存在することで、その機能が実装される可能性は低くなります。
この機能は、ずっと前から可能性のある機能のリストに入っています。しかし、実際に実装されるにはまだ十分なレベルに達していません。
UPDATE 2015年3月
提案された機能は、C# 6の仕様と設計のためにトップに近づいたが、その後カットされた。
関連
-
[解決済み】"出力タイプがクラスライブラリのプロジェクトは直接起動できない"
-
[解決済み] C++で、あるコンストラクタを別のコンストラクタから呼び出す(コンストラクタ・チェイニングを行う)ことは可能ですか?
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] explicit キーワードの意味は?
-
[解決済み] Java で、あるコンストラクタを別のコンストラクタから呼び出すにはどうすればよいですか?
-
[解決済み] C#のオートプロパティに初期値を与える最良の方法は何ですか?
-
[解決済み] C#でベースコンストラクタを呼び出す
-
[解決済み] List<T>をオブジェクトのプロパティでソートする方法
-
[解決済み] コンストラクタ内の仮想メンバー呼び出し
-
[解決済み] あるコンストラクタを別のコンストラクタから呼び出す
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】指定されたキャストが有効でない?
-
[解決済み】C#で四捨五入する方法
-
[解決済み】Excel "外部テーブルが期待された形式ではありません。"
-
[解決済み] エンティティタイプ <type> は、現在のコンテキストのモデルの一部ではありません。
-
[解決済み】C# ASP.NET使用時に「WebClientのリクエスト中に例外が発生しました。
-
[解決済み】Sequence contains no matching element(シーケンスにマッチする要素がない
-
[解決済み】MetadataException: 指定されたメタデータ・リソースをロードできない
-
[解決済み】ランダムなブーリアンを生成する最速の方法
-
[解決済み】インデックスが範囲外でした。コレクションパラメータname:indexのサイズより小さく、非負でなければなりません。
-
[解決済み】「namespace」なのに「type」のように使われる。