首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在接口中实现接口属性

在接口中实现接口属性
EN

Stack Overflow用户
提问于 2016-10-16 17:48:39
回答 2查看 47关注 0票数 0

我需要创建一个dll文件,它包含类的所有接口,但不包含任何类。因为我将这些接口用于很多类,所以它必须是这样的:

代码语言:javascript
复制
public interface IClassA
{
    string Word { get; }
}

public interface ITest<TClassA> where TClassA : IClassA
{
    TClassA A { get; }
}

以我想要的方式实现这些接口的两个类示例:

代码语言:javascript
复制
public class ClassA : IClassA
{
    public string Word
    {
        get;
        private set;
    }

    public string Sentence
    {
        get;
        private set;
    }

    public ClassA(string word, string sentence)
    {
        this.Word = word;
        this.Sentence = sentence;
    }
}

public class Test : ITest<ClassA>
{
    public ClassA A
    {
        get;
        private set;
    }

    public Test(ClassA a)
    {
        this.A = a;
    }
}

我想在主程序中做一些类似的事情:

代码语言:javascript
复制
public static void Main(string[] args)
{
    ClassA a = new ClassA("hey", "hey world!");
    Test t = new Test(a);

    Print((ITest<IClassA>)t);        
}

public static void Print(ITest<IClassA> t)
{
    Console.WriteLine(t.A.Word);
}

但是这个强制转换:(ITest<IClassA>)t产生了一个运行时错误。我该怎么解决它呢?谢谢!

EN

回答 2

Stack Overflow用户

发布于 2016-10-16 17:59:29

您应该将Test声明为

代码语言:javascript
复制
public class Test : ITest<IClassA>

而不是ITest<ClassA>

或者声明ITest<TClassA>TClassA上是协变的

代码语言:javascript
复制
public interface ITest<out TClassA> where TClassA : IClassA
票数 2
EN

Stack Overflow用户

发布于 2016-10-16 17:59:55

Test-class实现了具体的ClassA (public class Test : ITest<ClassA>)。

因此,您试图向ITest<IClassA>强制转换ITest<ClassA>,但显然失败了。

如果让Test-class实现IClassA,则强制转换会起作用:

代码语言:javascript
复制
public class Test : ITest<IClassA>
{
    public IClassA A
    {
        get; private set;
    }

    public Test(IClassA a)
    {
        this.A = a;
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40068962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档