泛型类型冲突?

泛型类型冲突?

问题描述:

我看到this interesting question其中谈到了T声明在课堂上的水平和同样的字母T(不同的含义)在方法级别。泛型类型冲突?

所以我做了一个测试。

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,编译器会发出警告。

但是,嗨,类型安全怎么了?我假设在方法级别有一个类型安全,但是012xx已经被声明的类的上下文又如何呢?

我的意思是,如果有人问我,我猜应该有一个错误那里没有警告

为什么编译器允许这样做? (我很想听到合理的答案

+3

我相信这与声明方法变量的方法大致相同,名称与已经存在的类字段名称相同 - 但此方法可行,但编译器也会警告您 – sll 2013-02-26 09:19:44

+0

您可以扩展“但是,嗨,类型安全性发生了什么? ?您担心什么类型的安全违规行为? – AakashM 2013-02-26 10:18:31

+0

将'public void MyMethod (T k)'改为'public void MyMethod(T k)'并且应该有一个错误:-) – Carsten 2013-02-26 10:38:58

有趣的问题。类型安全性在此保存。行为类似于全局和局部变量。在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"; 
} 

没有编译错误,它不应该是,因为类型安全能得到保障。程序可以编译。没有歧义。

警告应该有,因为牛逼覆盖其一流水平对口,有没有简单的方法在的MyMethod获得全球牛逼。它也掩盖了易读性。

MSDN说,关于灵活性和良好做法Generic Methods (C# Programming Guide)

如果定义采用相同类型参数作为包含类的通用方法,编译器生成,因为该方法范围内警告CS0693,争论为内部T提供的参数隐藏了为外部T提供的参数。如果需要灵活地调用泛型类方法,而类型参数不是在实例化类时提供的类型参数,则考虑为方法的类型参数提供另一个标识符。

这不是一个类型安全问题。这只是一个可读性问题 - 这就是为什么它只是一个警告。 (此外,T隐藏外T.)

如果变化的MyMethod()到:

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

它会打印出System.String你的示例代码,证明它是获得正确的类型。