C# VS 2015下编译失败,出现CS0452错误
我有一些代码可以从字符串表示中创建类型化值。这段代码处理值类型、类、数组等 不幸的是,升级到VS 2015后,代码分析在编译时输出此错误: CS0452类型“T”必须是引用类型,才能将其用作泛型类型或方法“Foo.Bar(string)”中的参数“T” 该错误在VS 2012或2013下未发生,代码已正确编译和运行 ProfileValue。值的类型为字符串。 在CreateValue中,T可以是值类型、类等 呼叫代码:C# VS 2015下编译失败,出现CS0452错误,c#,generics,visual-studio-2015,code-analysis,C#,Generics,Visual Studio 2015,Code Analysis,我有一些代码可以从字符串表示中创建类型化值。这段代码处理值类型、类、数组等 不幸的是,升级到VS 2015后,代码分析在编译时输出此错误: CS0452类型“T”必须是引用类型,才能将其用作泛型类型或方法“Foo.Bar(string)”中的参数“T” 该错误在VS 2012或2013下未发生,代码已正确编译和运行 ProfileValue。值的类型为字符串。 在CreateValue中,T可以是值类型、类等 呼叫代码: private static T CreateValue<T>
private static T CreateValue<T>(ProfileValue profileValue)
{
// setup code
if (typeof(T) == typeof(String))
{
// handle strings specially
}
else if (typeof(T).IsArray)
{
// handle arrays specially
}
else if (typeof(T).IsClass)
{
return Foo.Bar<T>(profileValue.Value); // <-- error occurs here
}
// additional cases
}
private static T CreateValue(ProfileValue ProfileValue)
{
//设置代码
if(typeof(T)=typeof(String))
{
//专门处理字符串
}
else if(类型(T).IsArray)
{
//专门处理数组
}
else if(类型(T).IsClass)
{
return Foo.Bar(profileValue.Value);//看起来像VS 2015下的代码契约在代码使用动态时失败。这是由于Roslyn编译器中的更改
您显示的代码无效,也不能用C#5.0编译。不知道为什么您认为Foo.Bar
可以在CreateValue
方法上不使用where t:class
进行编译。您所说的“new CS0452”是什么意思?这个错误对VS2015来说并不新鲜,而且是一个真正的编译器错误,而不是“代码分析”。您的意思是仅仅是“新建”代码?我在代码中没有看到任何东西表明它会起作用。使用Bar()
上的约束,如果调用方是泛型的,则需要类似的约束(如果不是泛型的,则需要传递带有无参数构造函数的引用类型)。更改CreateValue(ProfileValue ProfileValue)
toCreateValue(ProfileValue ProfileValue),其中T:class,new()
@PeterDuniho我的意思是我的代码的新版本。我稍微调整了问题标题和正文以反映这一点。你发布的代码中没有任何内容表明它应该编译。为了确保我不会变得老态龙钟,我幽默了你的问题,复制/粘贴了代码并试图编译它。我在VS2013中得到了完全相同的CS0452错误你是在VS2015中得到的。我真的不相信你能在VS2013中编译上述代码而不出错。请提供一个好的例子,说明你所问的代码将在VS2013中编译,但不会在VS2015中编译的场景。@PeterDuniho你是对的,我提供的简单示例代码不会编译。我去掉了一些de代码其中一个细节是对Foo.Bar的调用中有一个(动态)强制转换:return Foo.Bar((动态)profileValue.Value);在上面过于简单的代码中,它仍然无法编译,但奇怪的是,它在实际的源代码中工作并编译。我不确定为什么会有这种情况,或者为什么它会产生不同。
public class Foo
{
public static T Bar<T>(String value) where T : class, new()
{
// do something
}
}