c#には、「?」のような「匿名」の一般的なタグがありますか? Javaで?
質問
Java では、次のように、「不明な」ジェネリック型でパラメータ化された変数を宣言できます。
Foo<?> x;
C# には、この疑問符と同等の構造はありますか?
解決
簡単に言うと「ノー」です。C# には同等の機能がありません。
回避策としては、 Java 開発者の観点から見た C# デア・オバサンジョ著:
場合によっては、特定の型を含むデータ構造ではなく、任意の型を含むデータ構造を操作できるメソッドを作成する必要があるかもしれません。データ構造内のすべてのオブジェクトを出力するメソッド) を使用しながら、ジェネリックの強力な型指定の利点を活用します。C# でこれを指定するメカニズムはジェネリック型推論と呼ばれる機能を使用しますが、Java ではワイルドカード型を使用してこれが行われます。次のコード サンプルは、両方のアプローチがどのように同じ結果につながるかを示しています。
C# コード
using System;
using System.Collections;
using System.Collections.Generic;
class Test{
//Prints the contents of any generic Stack by
//using generic type inference
public static void PrintStackContents<T>(Stack<T> s){
while(s.Count != 0){
Console.WriteLine(s.Pop());
}
}
public static void Main(String[] args){
Stack<int> s2 = new Stack<int>();
s2.Push(4);
s2.Push(5);
s2.Push(6);
PrintStackContents(s2);
Stack<string> s1 = new Stack<string>();
s1.Push("One");
s1.Push("Two");
s1.Push("Three");
PrintStackContents(s1);
}
}
Javaコード
import java.util.*;
class Test{
//Prints the contents of any generic Stack by
//specifying wildcard type
public static void PrintStackContents(Stack<?> s){
while(!s.empty()){
System.out.println(s.pop());
}
}
public static void main(String[] args){
Stack <Integer> s2 = new Stack <Integer>();
s2.push(4);
s2.push(5);
s2.push(6);
PrintStackContents(s2);
Stack<String> s1 = new Stack<String>();
s1.push("One");
s1.push("Two");
s1.push("Three");
PrintStackContents(s1);
}
}
他のヒント
私の知る限り、C#ではそれを行うことはできません。BCL の機能と例は豊富にありますが、ジェネリックではないクラスを作成し、その後、前のクラスから基本動作を継承するジェネリック クラスを作成します。以下の例を参照してください。
class Foo
{
}
class Foo<T> : Foo
{
}
次のように書くことができます:
Foo t = new Foo<int>();
確かにクリーンなアプローチではありませんが、 Foo<object> x
も適しているかもしれません。
C# には同等の構文がありません。
C# に同等のものが存在しないというのは (完全に) 真実ではありません。型として使用したり、メソッドを呼び出したりできる静的な同等のものはありません。そのためには、使用します ホルヘの答え.
一方で、熟考のために同等のアイデアが必要な場合もあり、そこには同等のアイデアが存在します。あなたが持っている場合:
interface IFoo<T>
{
T Bar(T t, int n);
}
を得ることができます Type
それが表す IFoo<int>
を使用して typeof(IFoo<int>)
. 。あまり知られていませんが、あなたの質問に対する部分的な答えは、次のこともできます。 Type
それが表す IFoo<T>
を使用して typeof(IFoo<>)
.
使いたいときに便利です IFoo<T>
いくつかのための T
反省しても分からない T
実行時まで。
Type theInterface = typeof(IFoo<>);
Type theSpecificInterface = theInterface.MakeGenericType(typeof(string));
// theSpecificInterface now holds IFoo<string> even though we may not have known we wanted to use string until runtime
// proceed with reflection as normal, make late bound calls / constructions, emit DynamicMethod code, etc.
いいえ、C# には同じ概念がありません。Foo の基本クラス (おそらく非ジェネリック Foo) を参照するか、作業しているメソッド自体をジェネリックにする必要があります (これにより、Foo を参照でき、メソッドの呼び出し元に T の内容を決定させることができます)。は)。
それが役立つことを願っています。