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
块的内部,编译器也不知道T
是string
。
因此,它不会让你施放。 (出于同样的原因,你不能将DateTime
为string
)
你需要投掷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))