ASP.NET C#错误:Type必须是引用类型才能将其用作参数' T'在泛型类型或方法中

时间:2017-04-21 07:35:32

标签: c# asp.net parameters reference directcast

我有一个类:Constants.cs

代码:

namespace DataAccess.Utilities
{
  public class Constants
  {
    public enum ReturnCode
    {
      Fail = -1,
      Success = 0,
      Warning = 1
    }
  }
}

这是我的直播课程代码

public static T DirectCast<T>(object o) where T : class
{
    T value = o as T;
    if (value == null && o != null)
    {
        throw new InvalidCastException();
    }
    return value;
}

以下是我的错误代码

code = DirectCast<Constants.ReturnCode>(int.Parse(db.GetParameterValue(command, "RESULTCODE").ToString().Trim()));

错误讯息:

  

错误2类型&#39; DataAccess.Utilities.Constants.ReturnCode&#39;必须是参考类型才能将其用作参数&#39; T&#39;在泛型类型或方法中&#39; DataAccess.DataManager.QueueingManager.DirectCast(object)&#39;

在我从.net vb使用DirectCast之前,但是在c#中不存在DirectCast,所以我尝试搜索并获得一些代码,介绍如何创建与vb具有相同功能的DirectCast。

3 个答案:

答案 0 :(得分:1)

在.NET中,有值类型和引用类型。类是引用类型,例如,它们就像C ++中的指针一样。 int是值类型,枚举也是。 在泛型中,只有引用类型可以用作类型参数。

您可以删除方法的通用性,但您无法知道返回类型。而且,&#34; as&#34;不能使用enum,因为它是一种值类型。

我不明白为什么你想要一个枚举,你可以解析它:

Enum.Parse(typeof(Constants.ReturnCode), db.GetParameterValue(command, "RESULTCODE").ToString().Trim()));

答案 1 :(得分:0)

code = DirectCast<Constants.ReturnCode>(int.Parse(db.GetParameterValue(command, "RESULTCODE").ToString().Trim()));

应改为:

code = DirectCast<Constants>(int.Parse(db.GetParameterValue(command, "RESULTCODE").ToString().Trim()));

或者,这样做:见工作示例:

class Program
{
    static void Main(string[] args)
    {
        var fail = Constants.DirectCast<Constants.ReturnCode>(-1);
        var success = Constants.DirectCast<Constants.ReturnCode>(0);
        var warning = Constants.DirectCast<Constants.ReturnCode>(1);
        Console.WriteLine(fail);
        Console.WriteLine(success);
        Console.WriteLine(warning);
        Console.ReadLine();
    }
}

public class Constants
{
    public enum ReturnCode
    {
        Fail = -1,
        Success = 0,
        Warning = 1
    }

    public static T DirectCast<T>(object o)
    {
        T value = (T)o;
        if (value == null && o != null)
        {
            throw new InvalidCastException();
        }
        return value;
    }
}

答案 2 :(得分:0)

感谢您的评论。最后我的代码工作。

 public class Constants
 {
    public enum ReturnCode
    {
        Fail = -1,
        Success = 0,
        Warning = 1
    }
 }


 public static T DirectCast<T>(object o)
    {
        T value= (T)o;
        if (value== null && o != null)
        {
            throw new InvalidCastException();
        }
        return value;
    }


 code = Constants.DirectCast<Constants.ReturnCode>(int.Parse(db.GetParameterValue(command, "RESULTCODE").ToString().Trim()));