此错误的原因是什么(继承通用类)?

时间:2019-09-30 19:05:12

标签: c# generics inheritance

Error screenshot 我正在创建一包泛型类,并逐步从 T example_of_stored_class 指定泛型类型。

public class ModifiedList<example_of_stored_class> : AdvancedList<example_of_stored_class> 
{
    public void someMethod ()
    {
    }
}

public class AdvancedList<T> : List<T> where T : example_of_stored_class
{
    public AdvancedList ()
        {

        }
}
public class example_of_stored_class
{
    public string s = "Hi, i'm an example_of_stored_class!";
}

错误消息:

  

类型'example_of_stored_class'不能用作通用类型或方法'AdvancedList'中的类型参数'T'。从'example_of_stored_class'到'R7_app .example_of_stored_class'没有装箱转换或类型参数转换。

问题是-“ example_of_stored_class”和“ R7_app.example_of_stored_class”之间有什么区别?为什么会发生?

4 个答案:

答案 0 :(得分:4)

就这样:

public class ModifiedList : AdvancedList<example_of_stored_class>
{
    public void someMethod()
    {
    }
}

ModifiedList声明中存在错误。我不需要两次声明 example_of_stored_class 。谢谢,埃德·普伦凯特!

答案 1 :(得分:3)

List <String> lista = xmlPath.getList("activity.shopping.list().container.findAll{it.@number == 'eight'}.@color", String.class); 的首次出现是一个 type参数,因为它出现在类定义中类名之后的尖括号中:按照C#的规则, List <String> lista2 = xmlPath.getList("activity.shopping.list().category.findAll{it.@type == 'present'}.@label", String.class); 采用名为example_of_stored_class的类型参数。使用您的类的人可以为该参数提供任何实际的类型(至少,如果将整个内容编译为开头):

ModifiedClass

但是,您随后从另一个通用类继承了这个通用类,在该通用类中,您可以供应 example_of_stored_class作为AdvancedList类型参数的 value 。我们不在这里定义AdvancedList,因此尖括号中的类型被解释为您要用于type参数的类型。

您已经找到一种方法来使var x = new ModifiedList<int>(); var y = new ModifiedList<String>(); 在同一行中表示两个不同的事物,并且造成了混乱。

example_of_stored_class

这将编译:

example_of_stored_class

但是我怀疑您确实希望public class ModifiedList<example_of_stored_class> : AdvancedList<example_of_stored_class> 从具有{em> same 类型参数的public class ModifiedList<T> : AdvancedList<example_of_stored_class> { public void someMethod() { } } 继承:

ModifiedList<T>

否则,您将希望example_of_stored_class成为图片中唯一的类型参数。在这种情况下,ModifiedList不是通用的。它继承自“已实现”的通用类,该类已经提供了类型参数。

AdvancedList<T>

答案 2 :(得分:1)

你不能写:

ModifiedList<example_of_stored_class> : AdvancedList<example_of_stored_class>

因为在语句的第一部分中,您必须指示用于“替换”的通用参数。

因为它不能是类型。

您必须写:

ModifiedList<T> : AdvancedList<example_of_stored_class>

其中T不是代码定义的类型,因为它是模板工件。

此处的“模板”一词指的是C ++模板,即使C#泛型与C ++模板也不相同,但从历史上看,泛型来自模板。

Generic type parameters (C# Programming Guide)

您只是想写:

ModifiedList : AdvancedList<example_of_stored_class>

答案 3 :(得分:-1)

尝试一下,它可能会起作用或完全错误。

public abstract class Middle<T> : A<T> where T : ALayer
{
    public int middleAttr { get; set; }
}