【问题标题】:Why does a Generic<T> method with a "where T : class" constraint accept an interface为什么具有“where T : class”约束的 Generic<T> 方法接受接口
【发布时间】:2015-11-15 13:44:39
【问题描述】:

我有这个interface

public interface ITestInterface
{
    int TestInt { get; set; }
}

还有这个通用方法(带有T : class 约束):

public void Test<T>() where T : class
{
    // DoSomething
}

还有这个电话:

Test<ITestInterface>();

interface不是class(或者是吗?)时,所有东西都会编译和运行。

为什么会这样?

我第一次看到这个是在我的 WCF 代理类上:

public partial class TestServiceClient:
     System.ServiceModel.ClientBase<TestNamespace.ITestService>, TestNamespace.ITestService

ClientBase&lt;T&gt; 有这个定义:

public abstract class ClientBase<TChannel> : 
     ICommunicationObject, IDisposable where TChannel : class

【问题讨论】:

  • 在这里查看答案:stackoverflow.com/questions/1096568/…
  • 接口不是一个类,而是一个契约,一个类的样子的承诺。因此,如果您有一个带有接口的声明,调用代码应该使用实现该接口的对象的实例。
  • @o_weisman - 谢谢,在谷歌上找不到。
  • @GolezTrol - 我知道。我刚刚在我的 WCF 代理客户端上看到了它并创建了一个简单的示例。我知道有更好的方法来实现这样的目标。谢谢。
  • @haim770 - 刚刚检查过 - 如果您使用结构实现,编译器将显示非引用类型错误。

标签: c# generics interface constraints


【解决方案1】:

class 约束意味着类型必须是引用类型,不一定是类。

来自 C# 语言规范:

引用类型约束指定用于类型参数的类型实参必须是引用类型。所有已知为引用类型(定义如下)的类类型、接口类型、委托类型、数组类型和类型参数都满足此约束。

基本上,这意味着该类型不能是值类型。

值类型也可以实现接口,但是将值类型转换为接口会导致值被装箱

IComparable i = 0;

现在i 存储对已装箱0 的引用。

【讨论】:

    猜你喜欢
    • 2011-02-27
    • 1970-01-01
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    相关资源
    最近更新 更多