2013-04-10 129 views
0

我正在制作一个示例程序,供稍后参加C#独立学习的学生使用。我以为我明白<T>,但显然我缺乏一些神奇的秘密,使我可以充分利用它。不能将类型'char'隐式转换为类型Test <char>,为什么?

当我尝试做一个变量,它工作正常:

static Test<char> c = new Test<char>('n'); 

正如你可以看到它的实例化和一切。

现在,当我去把它分配给通过Console.Read()不同的值,那么它给我的错误: 无法隐式转换类型'char''ConsoleApplication1.Test<char>'

我曾经尝试都:

c = (char)Console.Read(); 

和:

c = Convert.ToChar(Console.Read()); 

甚至:(我知道这样做是愚蠢的,但我变得很烦,想看看它是否会工作)

c = (char)Convert.ToChar(Console.Read()); 

所以,我彻底困惑如何继续。请帮助。

编辑: 当前在构造类Test

public Test() { }//empty constructor 

    public Test(T obj) 
    { 
     variable = obj; 
    }//filled constructor 
+3

那么在第一种情况下,你正在调用构造函数。在其他情况下,你不是。是否有任何理由不使用'c = new Test ((char)Console.Read())'? – 2013-04-10 15:45:38

+0

我不想在这一点上做一个新的变量,所以为什么我会再次调用构造函数? – joesumbody122 2013-04-10 15:53:00

+1

因为您正在尝试创建一个新的*实例* Test'Test '。我认为你对变量和构造函数之间的关系感到困惑。 – 2013-04-10 15:58:26

回答

4

Test<char>不是char。它是一个新的泛型类型(Test<T>),它可能(假设)与提供的类型参数对象(即T)有关。在你的例子中,你已经声明你想使用char类型作为这个泛型类型的类型参数。

想象一下,你有Test<T>T类型的属性:

class Test<T>{ 
    public T MyTypeValue { get; set; } 
} 

然后,您可以创建这个泛型类型的新实例,并指定属性的你试图让事物的实例(在这种情况下,控制台读取):

static Test<char> c = new Test<char>(){ MyTypeValue = 'n'}; 

由于MyTypeValue由通用型的T类型参数的方法是char类型,你可以指定一个实际char它,但只是不到c。也就是说,没有实施一些其他的转换方法,就像奥斯汀所暗示的那样。

+0

我创建的变量作为全球所以我相信它会静态测试 c = new Test {c.MyTypeValue ='n'};' – joesumbody122 2013-04-10 16:51:34

+0

构造函数之后的{}'语法是[object initializer]的一个示例(http://msdn.microsoft.com /en-us/library/vstudio/bb384062.aspx)。您不包括您正在修改的实例名称。它被认为是新的实例。 (另外,我编辑了我的回应:构造函数调用丢失了parens。) – Peter 2013-04-10 20:14:04

+0

语法不是我添加的,格式化程序必须在发布时进行更改。我实际上将它们作为括号。 – joesumbody122 2013-04-11 15:09:41

相关问题