2013-06-09 8 views
8

は、Tを使用するメソッドを持つクラスがあるとします。同じ名前の標準メソッドもあります。ジェネリックメソッドシグネチャと標準シグネチャが同じ

Tが標準の方法と同じ種類の場合はどうなりますか?標準的なメソッドが呼び出されます。

とにかく彼にT-メソッドを強制的に呼び出させる方法はありますか?システムを使用して

namespace ConsoleApplication3 
{ 
class Program 
{ 
    static void Main() 
    { 
     Generics<Int32> anInt = new Generics<Int32>(4); 
     Generics<String> aString = new Generics<String>("test"); 
    } 
} 

public class Generics<T> 
{ 
    public T Member; 

    public String ErrorMessage; 

    public Generics(T member) 
    { 
     this.Member = member; 
    } 

    public Generics(String errorMessage) 
    { 
     this.ErrorMessage = errorMessage; 
    } 
} 
} 
+2

[こちら]をチェックしましたか(http://blogs.msdn.com/b/jaredpar/archive/2008/04/14/gotcha-generic-overload-resolution-whe n - generically.aspx)アウト? – sq33G

+0

同じ名前のメソッドがすでに存在することがわかっている場合は、メソッドの名前を変更する必要があります。コードを継承している別のプログラマを想像してください。 – Sayse

+0

ありがとう、sq33G、今私はそれを回避する方法を理解しています。 私の場合私は少し違って行った。私はGeneric から派生し、それを正しく処理するコンストラクタを書いてくれました。 –

答えて

5

申し訳ありませんが、

最も簡単な解決策は、動作の違いを示すために2つの異なるメソッド名を使用することです。問題のメソッド名はコンストラクタなので、名前を制御することはできないため、少なくとも1つを通常のメソッドに変更する必要があります。たとえば、次のように

public class Generics<T> 
{ 
    public T Member; 

    public String ErrorMessage; 

    public Generics(T member) 
    { 
     this.Member = member; 
    } 

    private Generics() 
    { 
     // empty constructor just to allow the class to create itself internally 
    } 

    public static Generics<T> FromError(String errorMessage) 
    { 
     return new Generics<T> { ErrorMessage = errorMessage }; 
    } 
} 

挙動の違いは、ユーザーに絶対に明らかにされているように、個人的に私は、静的メソッドであることを両方のコンストラクタを変更します。ただし、コンストラクタを1つだけ変更した場合は、エラーを発生させます。

1

さて、私は答えに私のコメントをします。

まず、この操作は行わないでください。しない。人間だけでなくコンピュータだけでなく、コードを読むことができるようにします。 (そこに、私はC#プログラマースペースのメンバーとして私の義務を果たしました)

秒。あなたが一般的な方法を使用するように強制することができ、と呼んでいるどのようなタイプのコンパイルだとき、コンパイラは言うことができないように、あなたのコードを設計する場合

としてはhereを説明しました。

static Generics<T> Test<T> (T parameterToTest) { 
    return new Generics<T>(parameterToTest); 
} 

static void Main() 
{ 
    Generics<Int32> anInt = Test<Int32>(4); 
    Generics<String> aString = Test<String>("test"); 
} 
0

Iは、単に(この特定の場合のために)これをした:

私はジェネリック

protected Generics() { } 

に空の保護コンストラクタを加えた後、私はT =文字列の特定のケースについて導出

public class GenericsOfString : Generics<String> 
    { 
     public GenericsOfString(String text, Boolean isErrorMessage) 
     { 
      if (isErrorMessage) 
      { 
       this.ErrorMessage = text; 
      } 
      else 
      { 
       this.Member = text; 
      } 
     } 
    } 
関連する問題