2009-05-05 14 views
1
class test <T> where T : class 
{ 
    public void Write<T>() 
    { 
     Console.Write(typeof(T).FullName); 
    } 
} 

上記のクラスでは、クラスの文字列(test<string> Test = new test<string>)を渡してからメソッドにintを渡すことはできますか?もしそうなら、出力は何ですか?そうでない場合、これはどのような問題を引き起こしますか?ジェネリック(ジェネリック)とジェネリックコレクションを頻繁に使用しているにもかかわらず、実際にはこれを試していません。ジェネリッククラスとジェネリックメソッド

I /書き込み方法は、一般的なクラスを参照してください、次のとおりです。

class <T> where T : class 
{ 
    public T Write() 
    { 
     Console.Write(T.ToString()); 
    } 
} 

答えて

3

をもともと書かれていたものではありません。クラスの異なるポイントで異なるタイプを使用するには、複数の汎用パラメータが必要です。メソッドレベルで異なるものを定義し、スコットは、あなたが同じ名前のパラメータを使用することができます指摘したように、あなたのサンプルが

class Test<T> where T : class { 
    public void Write<U>(U arg1) { 
    Console.WriteLine(arg1.ToString()); 
    } 
} 

使用

var t = new Test<string>(); 
t.Write(42); 

を仕事を得ることが可能です。そうしても、警告が表示され、一般的には人々を混乱させるでしょう。現在スコープ内にあるすべての汎用パラメータに別個の名前を付ける方がはるかにクリーンです。

+2

メソッドを見ると、 "T"は実際にはメソッドパラメータです。クラスのパラメータと同じ名前を持つため、警告が生成されます。しかし、実際には違法ではありません。 (私がUに名前を変更することをお勧めしますが、お勧めのように) –

+0

@Scott、私は実際にはC#が警告を発すると警告します。奇妙な:( – JaredPar

0

あなたがクラスに別々の方法で型の変数を宣言したいことがあります - それとして

class Test<T> where T : class { 

    public void Method<U>(U val) { 
     Console.WriteLine(typeof(U).FullName); 
    } 

} 
+0

私は実際に何かをしようとしていませんでした。私は今日C#の試験を受けなければなりませんでした。私が提案したものと非常によく似た質問/コードを考え出しました。私は答えが分からないので、私はここで尋ねると思った。残念ながら、私はコードをそのまま覚えていません。 – dotnetdev

関連する問題