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()));