実装できない有効な C# インターフェイスを定義することは可能ですか?
このトリビアの質問は、StackOverflow には適していませんが、簡単に答えられます。(間違っていることが判明しました!読んでください!)
class C
{
private C() {}
}
interface IFoo<T> where T : C, new()
{
}
IFoo<T>
T
の代わりに使用できる型引数がないため、を実装することはできませんT
。C
は、パラメーターなしのパブリック コンストラクターを持たないため機能しません。また、既定のコンストラクターがプライベートであるため、C
派生クラスが存在しない可能性があります。C
(まあ、アクセス可能なC
insideの派生クラスがあるかもしれC
ませんが、この場合はありません。)
更新: コメンター「mike z」が正しく指摘している
class X<T> : IFoo<T> where T : C, new() {}
インターフェースを実装しますが、もちろんインスタンス化する方法はありませんX<T>
!
さらに良いことに、ユーザー "GranBurguesa" は、プライベート コンストラクターを呼び出さない限り、C の派生クラスを宣言することが許可されていると指摘しています。これは、インスタンス化時にクラッシュして停止した場合にのみ可能です。(まあ、うるさいですが、再帰呼び出しがクラッシュの代わりに無限ループに最適化されることも許可されます。)
どちらの巧妙な回避策も、哲学的な問題を提起します。インターフェイスが誰もインスタンス化できないクラスによって実装されている場合、それは本当に実装されているのでしょうか? もちろん、GranBurguesa はそれIFoo<D>
を実装して構築できることを示しているので、私の答えは実際には間違っています。
SLaks の削除された回答で示唆されているような、ジェネリック メカニズムの悪用が「無限」型につながるケースもあります。このような型は、CLR では有効ではありません。C# 設計チームは、C# コンパイラ仕様に同様の言語を追加することを検討しましたが、まだ実現していません。これらの型を使用すると、コンパイラまたはランタイムがクラッシュする可能性があります。
コンパイラをクラッシュさせる無限型の例については、私の記事を参照してください。
無限に、しかし超えない
これが1つです。このコードをカット アンド ペーストして Visual Studio に貼り付けると、このインターフェイスを実装できないことがわかります。
interface ΙAmAPerfectlyOrdinaryInterface { }
class C : IAmAPerfectlyOrdinaryInterface { }