【问题标题】:cannot implicitly convert type 'char' to type Test<char>, why?无法将类型 'char' 隐式转换为类型 Test<char>,为什么?
【发布时间】:2013-04-02 13:33:57
【问题描述】:

我正在为以后学习 C# 进行独立学习的学生制作一个示例程序。我以为我理解了&lt;T&gt;,但显然我缺少一些能让我充分利用它的神奇秘密。

当我尝试创建一个变量时,它工作正常:

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

如您所见,它已被实例化。

现在,当我通过 Console.Read() 将其分配给不同的值时,它给了我错误: 无法将类型'char' 隐式转换为'ConsoleApplication1.Test&lt;char&gt;'

我都试过了:

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

【问题讨论】:

  • 好吧,在第一种情况下,您正在调用构造函数。在其他情况下,你不是。你有什么理由不使用c = new Test&lt;char&gt;((char) Console.Read())
  • 那时我并不想创建一个新变量,那我为什么要再次调用构造函数呢?
  • 因为您正在尝试创建Test&lt;T&gt; 的新实例。我认为您对变量和构造函数之间的关系感到困惑。
  • 由于这是一个供其他学生将来使用的演示程序,我将尝试在不同的场合同时使用这两种程序。注意:我在这个过程中学习,所以我觉得这很有趣。 =D
  • 当然,您肯定需要同时使用构造函数和变量。但是您对“我当时并不想创建一个新变量,所以我为什么要再次调用构造函数?”的评论。表明您从根本上误解了调用构造函数的目的。

标签: c# char type-conversion console-application


【解决方案1】:

Test&lt;char&gt; 不是char。这是一种新的泛型类型 (Test&lt;T&gt;),它(可能)对提供的类型参数(即T)的对象做了一些事情。在您的示例中,您已声明要使用 char 类型作为此泛型类型的类型参数。

假设您在 Test&lt;T&gt; 上拥有一个类型为 T 的属性:

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

然后您可以创建此泛型类型的新实例,并将该属性分配给您尝试获取的事物的实例(在这种情况下,控制台读取):

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

由于MyTypeValuechar 类型,通过泛型类型的T 类型参数,您可以将实际的char 分配给它,但不能分配给c。也就是说,没有实现@Austin 所建议的其他一些转换方法。

【讨论】:

  • 我将变量创建为全局变量,所以我相信它会是 static Test&lt;char&gt; c = new Test&lt;char&gt;{ c.MyTypeValue = 'n'};
  • 构造函数后面的{ } 语法是object initializer 的一个示例。您不包括您正在修改的实例名称。假定它是新实例。 (另外,我编辑了我的回复:构造函数调用缺少括号。)
  • { } 语法不是我添加的,格式化程序在我发布时必须更改它。我实际上将它们作为括号。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-07-06
  • 2014-02-04
  • 2015-08-07
  • 1970-01-01
  • 2020-06-16
  • 1970-01-01
  • 2013-05-13
相关资源
最近更新 更多