ASP.NET C# Ошибка: тип должен быть ссылочным типом, чтобы использовать его в качестве параметра 'T' в универсальном типе или методе

У меня есть класс: 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 Тип "DataAccess.Utilities.Constants.ReturnCode" должен быть ссылочным типом, чтобы использовать его в качестве параметра "T" в универсальном типе или методе "DataAccess.DataManager.QueueingManager.DirectCast(object)".

Прежде чем я использую DirectCast из.net VB, но DirectCast не существует в C#, поэтому я пытаюсь найти, и я получаю некоторые коды о том, как создать DirectCast, который имеет ту же функцию для VB.

3 ответа

Решение
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;
    }
}

В.NET существуют типы значений и ссылочные типы. Классы являются ссылочными типами, например, они похожи на указатели в C++. int - это типы значений, также перечисления. В общем, в качестве аргументов типа могут использоваться только ссылочные типы.

Вы можете удалить универсальность вашего метода, но не сможете узнать тип возвращаемого значения. Более того, "as" не будет работать с enum, потому что это тип значения.

Я не понимаю, почему вы хотите бросить перечисление, вы можете разобрать это:

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

Спасибо за комментарии. наконец мой код работает.

 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()));
Другие вопросы по тегам