我在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的实例。在第一个示例中,MyPropertyT是什么,即使它是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/

10-08 21:46