Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#中的模板使用泛型类型错误_C#_Templates_Generics - Fatal编程技术网

c#中的模板使用泛型类型错误

c#中的模板使用泛型类型错误,c#,templates,generics,C#,Templates,Generics,我正在做一个关于c#的项目。 我正在使用类名状态的模板,代码如下: class State<T> { private T state; //so T could be string or Cell } 现在,我想要一个新的状态作为我的初始状态,表示: public class Maze { public State<Cell> initialState; public void CreateMaze(string name, int

我正在做一个关于c#的项目。 我正在使用类名状态的模板,代码如下:

class State<T>
{
   private T state; //so T could be string or Cell
}   
现在,我想要一个新的
状态
作为我的初始状态,表示:

public class Maze
{
  public State<Cell> initialState;        
  public void CreateMaze(string name, int type)  //creating maze
  {     
    Board Maze = new Cell[size, size]; //board is matrix of cells
    currentRow = random.Next(0, size);
    currentCol = random.Next(0, size);
    Maze[currentRow, currentCol].value = '*';
    initialState = State<Maze[currentRow, currentCol]>; 
  }
}
公共类迷宫
{
公共国家;
public void CreateMaze(字符串名称,int类型)//创建maze
{     
电路板迷宫=新单元[大小,大小];//电路板是单元矩阵
currentRow=随机。下一步(0,大小);
currentCol=随机。下一步(0,大小);
迷宫[currentRow,currentCol]。值='*';
初始状态=状态;
}
}
给我错误“使用泛型类型需要一个参数” 救命啊

此行将创建一个类型为
State
的新对象。类型
状态
是在运行时创建的,它基于您定义的泛型
状态
,使用一个称为“具体化”的过程(有关更多信息,请参阅)。结果得到的是一个类型(在您的例子中是一个类),它基本上是
状态
,每次出现
T
时,它的主体都会被
单元格
替换

因为在
状态中只有一个私有字段,所以这个类(及其实例)是非常无用的

要使用
状态
,可以将其
状态
字段标记为
公共
。或者,您可以将其更改为属性,也可以声明构造函数:

class State<T>
{
    public T state {get;set;}

    public State(T state)
    {
        this.state = state;
    } 
}
(请注意,不要用大写字母命名变量,因为大写名称通常用于C#中的类和方法。看,即使StackOverflow的语法高亮显示也会混淆。)


具有公共属性,可以访问< C++ >代码>实例,存储在<代码>初始状态中,简单地为“代码>初始状态”。 <>与C++中的模板不同,不能使用类型的实例访问泛型类型。必须使用类型的名称。这意味着该行需要进行一些更正:

initialState = State<Maze[currentRow, currentCol]>;
“但是等等,
状态
字段还没有设置!”你喊道。是的,因为目前无法设置,因为它是一个私有字段。你也可以

  • 将其转化为财产(推荐)或
  • 把它改成公共的
如果将其转换为属性,它将如下所示:

public T MyState {
    get; set;
}
initialState = new State<Cell>(Maze[currentRow, currentCol]);
你也可以使它不可变,不知道你是否想这样做

public T MyState {
    get;
}
然后,编写一个接受状态参数的构造函数,并将其分配给属性:

public State(T state) {
    this.MyState = state;
}
现在您可以像这样初始化您的
状态

public T MyState {
    get; set;
}
initialState = new State<Cell>(Maze[currentRow, currentCol]);
initialState=新状态(迷宫[currentRow,currentCol]);
我想你现在基本上明白了


不能仅通过将类的实例放在泛型类型参数应该放的位置来设置泛型类的属性/字段。相反,您需要通过赋值语句手动设置属性/字段。

泛型由类型(即类或值类型)参数化,而不是由对象(即类的实例)和值参数化。您试图使用对象实例作为类型参数,如@TerraPass所说。你不能这么做,我该怎么做?它仍然是一个状态好吧,我不清楚你想做什么,但试着用
initialState=State(currentRow,currentCol)替换最后一行并查看它的运行情况。
public T MyState {
    get;
}
public State(T state) {
    this.MyState = state;
}
initialState = new State<Cell>(Maze[currentRow, currentCol]);