types'T'的值不能被转换为

这可能是一个新手的问​​题,但谷歌惊讶地没有提供答案。

我有这个相当人造的方法

T HowToCast<T>(T t) { if (typeof(T) == typeof(string)) { T newT1 = "some text"; T newT2 = (string)t; } return t; } 

来自一个C + +背景我期望这个工作。 但是,对于上述两个赋值,无法将“不能将typesT'隐式转换为string”和“不能将types'T'转换为string”。

我要么做一些概念上的错误,要么就是错误的语法。 请帮我整理一下。

谢谢!

即使它位于if块的内部,编译器也不知道Tstring
因此,它不会让你施放。 (出于同样的原因,你不能将DateTimestring

你需要投掷object ,(任何T可以投),并从那里到string (因为object可以被转换为string )。
例如:

 T newT1 = (T)(object)"some text"; string newT2 = (string)(object)t; 

两条线都有同样的问题

 T newT1 = "some text"; T newT2 = (string)t; 

编译器不知道T是一个string,所以没有办法知道如何分配。 但是既然你检查过,你可以强迫它

 T newT1 = "some text" as T; T newT2 = t; 

你不需要施加t,因为它已经是一个string,也需要添加约束

 where T : class 

如果你正在检查显式types,为什么你将这些variables声明为T

 T HowToCast<T>(T t) { if (typeof(T) == typeof(string)) { var newT1 = "some text"; var newT2 = t; //this builds but I'm not sure what it does under the hood. var newT3 = t.ToString(); //for sure the string you want. } return t; } 

如果你的类和方法都有一个通用的声明,你也会得到这个错误。 例如下面的代码给出了这个编译错误。

 public class Foo <T> { T var; public <T> void doSomething(Class <T> cls) throws InstantiationException, IllegalAccessException { this.var = cls.newInstance(); } } 

此代码确实编译(注意T从方法声明中删除):

 public class Foo <T> { T var; public void doSomething(Class <T> cls) throws InstantiationException, IllegalAccessException { this.var = cls.newInstance(); } } 

改变这一行:

 if (typeof(T) == typeof(string)) 

对于这一行:

 if (t.GetType() == typeof(string))