泛型类型冲突?
问题描述:
我看到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已经被声明的类的上下文又如何呢?
我的意思是,如果有人问我,我猜应该有一个错误那里没有警告。
为什么编译器允许这样做? (我很想听到合理的答案)
答
有趣的问题。类型安全性在此保存。行为类似于全局和局部变量。在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你的示例代码,证明它是获得正确的类型。
我相信这与声明方法变量的方法大致相同,名称与已经存在的类字段名称相同 - 但此方法可行,但编译器也会警告您 – sll 2013-02-26 09:19:44
您可以扩展“但是,嗨,类型安全性发生了什么? ?您担心什么类型的安全违规行为? – AakashM 2013-02-26 10:18:31
将'public void MyMethod(T k)'改为'public void MyMethod(T k)'并且应该有一个错误:-) –
Carsten
2013-02-26 10:38:58