我需要创建一个包含类的所有接口但不包含任何类的dll文件。 因为我将这些接口用于很多类,所以必须是这样的:
public interface IClassA
{
string Word { get; }
}
public interface ITest<TClassA> where TClassA : IClassA
{
TClassA A { get; }
}
以我想要的方式实现这些接口的两个类的示例:
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;
}
}
我想在主程序中做类似的事情:
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
会产生运行时错误。
我该如何解决?
谢谢!
答案 0 :(得分:2)
您应该将Test
声明为
public class Test : ITest<IClassA>
而不是ITest<ClassA>
。
或声明ITest<TClassA>
是TClassA
的协变:
public interface ITest<out TClassA> where TClassA : IClassA
答案 1 :(得分:1)
Test
- 类实现具体 ClassA
(public class Test : ITest<ClassA>
)。
所以你试图将ITest<ClassA>
投射到显然失败的ITest<IClassA>
。
如果你让Test
- 类实现IClassA
,那么演员就可以了:
public class Test : ITest<IClassA>
{
public IClassA A
{
get; private set;
}
public Test(IClassA a)
{
this.A = a;
}
}