2012-10-26 6 views
7

を省略することがどのように私はこのタイプのクラスがあります。GenericsでTが無効な場合はどうなりますか?角括弧に

class A<TResult> 
{ 
    public TResult foo(); 
} 

をしかし、時には、私はTResultvoidあるタイプ、つまり、非ジェネリッククラスとしてこのクラスを使用する必要があります。私は次のようにクラスをインスタンス化することはできません

var a = new A<void>(); 

また、私はむしろ、角括弧を省略タイプを指定しないと思います。

var a = new A(); 

私はしたくない再それは同じことをするので、クラス全体を書く。

+1

「オブジェクト」を使用できませんか? – Davio

+0

@Davioはい、それは恐ろしいです... – Nick

+3

その場合、制約なしで別のクラス 'A'を作成する必要があります。しかし、クラス実装はTなしでどのように見えるのですか?その上に 'T foo()'メソッドがあります。無効の場合はどうすればよいですか? – nawfal

答えて

8

voidは、FCLに対応するSystem.Void構造体でも、C#では実際の型ではありません。あなたが代わりにSystem.Action<void>の、System.Action/System.Action<T>があるFCLで見るだけでなく、Task代わりのTask<void>でき

class A 
{ 
    //non generic implementation 
} 

class A<T> : A 
{ 
    //generic implementation 
} 

:私はあなたがこのような、ここで非ジェネリック版が必要怖いです。 CLI specification(ECMA-335)から

EDIT

タイプの次の種類は(ジェネリック型またはメソッドの) インスタンス内の引数として使用することはできません。

種類(例えば、System.Generic BYREF。 Collection.List`1 <文字列&> 無効

tを指すフィールドを含む値の型彼CIL評価スタック(例えば、リスト< System.RuntimeArgumentHandle>)

のボイド(例えば、リスト< System.Void>は無効です)

4

私はコメントで掲示として、あなたが継承して、それが良い見えるようにすることができますジェネリッククラスから:

class A:A<object> 
{ 
} 

これは明らかに、一般的なパラメータを隠しますが、私の経験では、このクラスを継承する間違った方法で、私のクラスは、より複雑だしながら、私はこれをしなかったたびに、私はそれを後悔していることに注意してください。

+0

代わりに、何百という行のコードでクラスを再利用することができます – Nick

1

voidは単にC#の型ではないため、型パラメータとして持つことはできません。しかしそれにもかかわらず、それが1つのように機能性を望む時があります。

このような場合、Reactive Extensionsで使用されるSystem.Reactive.Unitのような単純な置換型を使用することができます。

関連する問題