我在MSDN上读了一篇有关C#中泛型的优秀文章。
我脑海中浮现的问题是-为什么要使用通用约束?
例如,如果我使用如下代码:
public class MyClass<T> where T : ISomething
{
}
我不能用
T
切换此类中ISomething
的所有引用吗?使用这种方法有什么好处?
最佳答案
您会问:“我不能用T
切换此类中ISomething
的所有引用吗?”所以我想你的意思是比较:
public class MyClass<T> where T : ISomething
{
public T MyProperty { get; set; }
}
和:
public class MyClass
{
public ISomething MyProperty { get; set; }
}
在第二个示例中,
MyProperty
仅保证是ISomething
的实例。在第一个示例中,MyProperty
是T
是什么,即使它是ISomething
的特定子类型。考虑ISomething
的具体实现:public class MySomething : ISomething
{
public string MyOtherProperty { get; set; }
}
现在,如果我们使用第一个通用示例,则可以有:
MyClass<MySomething> myClass = new MyClass<MySomething>();
Console.WriteLine(myClass.MyProperty.MyOtherProperty);
另一方面,如果我们使用第二个示例,则将无法访问
MyOtherProperty
,因为它仅是ISomething
:MyClass myClass = new MyClass();
Console.WriteLine(myClass.MyProperty.MyOtherProperty); // Won't compile, no property "MyOtherProperty"
另外,这些类型约束之所以有用,是因为您可以引用
MyProperty
(类型T
)并访问ISomething
的成员。换句话说,如果ISomething
声明为:public interface ISomething
{
public string SomeProperty { get; set; }
}
然后,您可以访问
MyProperty.SomeProperty
。如果您省略了where T : ISomething
,那么您将无法访问SomeProperty
,因为仅知道T
的类型为object
。关于c# - 为什么在C#中使用通用约束,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4073852/