2013-02-26 17 views
9

メソッドレベルでT(別の意味)のクラスレベルでの宣言についてはの宣言についてはthis interesting questionが見えました。汎用タイプの競合ですか?

私はテストをしました。

static void Main(string[] args) 
     { 
      var c = new MyClass<int>(); //T is int 
      c.MyField = 1; 
      c.MyProp = 1; 
      c.MyMethod("2"); 
     } 


     public class MyClass<T> 
     { 
      public T MyField; 
      public T MyProp { get; set; } 
      public void MyMethod<T>(T k) 
      { 
      } 
     } 

Eric saidとして、コンパイラは警告します。

しかし、ちょっと、型の安全に何が起こったのですか? のメソッドレベルに型の安全性があると仮定しますが、Tが既に宣言されているクラスのという文脈についてはというグローバルコンテキストについてはどうでしょうか。誰かが私を求めているならば

私が意味する、私はそこにエラーこととない警告はずですよね。

なぜコンパイラで許可されていますか? (私は妥当な答えを聞きたいです。

+3

これは、既存のクラスフィールド名と同じ名前のメソッド変数を宣言するのとほとんど同じだと思います。これは動作しますが、コンパイラも警告します。 – sll

+0

「しかしちょっと、型の安全に何が起こったのですか? ?どのような型の安全違反があれば、それは起こっているのですか? – AakashM

+0

'public void MyMethod (T k)'を 'public void MyMethod(T k)'に変更すると、エラーが発生するはずです:-) – Carsten

答えて

3

興味深い質問。タイプの安全性はここに保存されます。振る舞いは、グローバル変数とローカル変数です。 MyMethodタイプTは明白です。次のように我々はまた、MyClassのの新しいインスタンスを作成して返すことができます。

public class MyClass<T> 
{ 
    public T MyField; 
    public T MyProp { get; set; } 
    public MyClass<T> MyMethod<T>(T k) 
    { 
     return new MyClass<T>(); 
    } 
} 

プログラム:

static void Main() 
{ 
    var c = new MyClass<int>(); //T is int 
    c.MyField = 1; 
    c.MyProp = 1; 

    var myClass = c.MyMethod("2"); 
    myClass.MyField = "2"; 
    myClass.MyField = "4"; 
} 

を型の安全性が保たれているので、そこには、コンパイル・エラーがありません、それはすべきではありません。プログラムをコンパイルすることができます。あいまいさはありません。 Tがクラスレベルの対応をオーバーライド、そのグローバルTを得るMyMethodはで簡単な方法がないため

警告は、そこにあるべきです。また、読みやすさもわかりません。あなたが含まれているクラスと同じ型のパラメータを取りジェネリックメソッドを定義する場合、コンパイラが原因メソッドの範囲内で警告CS0693が生成さ

、引数:

MSDNはGeneric Methods (C# Programming Guide)の柔軟性と優れた実践について語りますインナーT用に提供されている引数は、外部Tに渡された引数を隠す。クラスがインスタンス化されたときに提供されるもの以外の型引数を持つジェネリッククラスメソッドを柔軟に呼び出す必要がある場合は、メソッドのtypeパラメータ。

2

これは型安全性の問題ではありません。それは単なる可読性の問題です。それが単なる警告なのです。変更MyMethodは()した場合に

を(また、Tは、外側のT.を隠す):

public void MyMethod<T>(T k) 
{ 
    Console.WriteLine(typeof(T).FullName); 
} 

それが正しい型を取得していることを証明し、あなたのサンプルコードの可能System.Stringプリントアウトします。

関連する問題