2013-02-26 32 views
9

Sınıf düzeyi ve yöntem düzeyinde aynı harfle T (farklı anlam) yaklaşık T deklarasyon konuşur this interesting question gördü.Genel Tür Çakışması?

Ben de bir test yaptım. Derleyici, uyarısını Eric said olarak uyarır.

Ama Hey, ne oldu güvenliğini yazmak için? Ben T zaten ilan edilmiştir sınıfın küresel bağlamda yaklaşık Yöntem düzeyinde ama ne de bir tür güvenlik olmadığını varsayalım.

Birinin beni sorardım, ben bir hata orada ve değil bir uyarı olmalıdır tahmin ediyorum yani.

Derleyici neden buna izin veriyor?

+3

Bunun, zaten mevcut sınıf alanı adıyla aynı adı taşıyan yöntem değişkeni ile aynı olduğuna inanıyorum - bu çalışır ancak derleyici de sizi uyarır – sll

+0

"Ama Hey, güvenlik türüne ne oldu?" ? Ne tür bir güvenlik ihlali varsa, endişe duyuyor musunuz? – AakashM

+0

'public void MyMethod (T k)' yi 'public void MyMethod (T k)' olarak değiştirin ve bir hata olmalı :-) – Carsten

cevap

3

İlginç bir soru (Ben makul bir cevap duymak isteriz). Tip güvenliği burada korunur. Davranış hem küresel hem de yerel değişkenlerdir. olarak T tip açık olan myMethod. Ayrıca oluşturmak ve aşağıdaki gibi Sınıfım yeni örneği döndürebilir:

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

programı: tip emniyet korunur, çünkü

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"; 
} 

hiçbir derleme hatası var ve bu olmamalıdır. Program derlenebilir. Belirsizlik yok. T sınıfsal düzeyi muadili geçersiz kılar ve bu küresel T elde etmek myMethod yılında basit bir yolu yoktur çünkü

uyarı, orada olmalı. Ayrıca okunabilirliği de gizler. Eğer içeren sınıfla aynı tip parametreleri alır genel bir yöntem tanımlarsanız, derleyici çünkü yöntem kapsamında uyarı CS0693 üretir

, argüman:

MSDN Generic Methods (C# Programming Guide) esneklik ve iyi uygulama hakkında söylediği iç T için sağlanan bağımsız T için verilen bağımsız değişkeni saklar. Sınıf oluşturulduğunda sağlananlar dışındaki tür bağımsız değişkenleri ile genel bir sınıf yöntemi çağırma esnekliğine gereksinim duyarsanız, yöntemin type parametresi için başka bir tanımlayıcı sağlamayı düşünün. .

2

Bu tip emniyet sorunu değildir. Bu sadece okunabilir bir konu - bu yüzden sadece bir uyarı.

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

Bu sizin örnek kod için System.String yazdırıldığı o doğru türü elde ettiğini kanıtlayan: değişiklik MyMethod() ise

(Ayrıca, T dış T. gizler).

İlgili konular