Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# VS 2015下编译失败,出现CS0452错误_C#_Generics_Visual Studio 2015_Code Analysis - Fatal编程技术网

C# VS 2015下编译失败,出现CS0452错误

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>

我有一些代码可以从字符串表示中创建类型化值。这段代码处理值类型、类、数组等

不幸的是,升级到VS 2015后,代码分析在编译时输出此错误:

CS0452类型“T”必须是引用类型,才能将其用作泛型类型或方法“Foo.Bar(string)”中的参数“T”

该错误在VS 2012或2013下未发生,代码已正确编译和运行

ProfileValue。值的类型为字符串。 在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)
to
CreateValue(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
    }
}