试图概括 c# 函数但得到“无法将'int'转换为'T'”

Posted

技术标签:

【中文标题】试图概括 c# 函数但得到“无法将\'int\'转换为\'T\'”【英文标题】:Trying to generalize c# function but getting "Cannot convert 'int' to 'T'"试图概括 c# 函数但得到“无法将'int'转换为'T'” 【发布时间】:2020-04-23 00:02:02 【问题描述】:

我有以下通用函数,它采用 Enum 类型,显示“选项”列表,然后循环/等待用户选择可行的选项:

public static T AskGenericType<T>(string message) where T : Enum

    //Display options
    Console.WriteLine(message);
    foreach (var item in Enum.GetValues(typeof(T)))
    
        Console.WriteLine($"[(int)item] item");
    

    var returnInt = TryParseInput();

    while (true)
    
        if (Enum.IsDefined(typeof(T), returnInt))
            break;
        //Cannot parse input as one of the choices presented from the Enum
        Console.WriteLine($"Please choose from one of the options.");
        returnInt = TryParseInput();
    

    return (T)returnInt; //<---this produces the compile error


private static int TryParseInput()

    int returnInt;
    while (!int.TryParse(Console.ReadLine(), out returnInt))
    
        //Cannot parse input as an integer
        Console.WriteLine($"Selection is not a number. Please try again.");
    

    return returnInt;

如果我从函数定义和代码块中完全删除 &lt;T&gt; 泛型,我可以让函数工作。我得到的错误是:

无法将类型“int”转换为“T”

我正在寻找有关如何通过循环保留函数的通用性质的建议,因为我有几个 Enum 类型要迭代,我不想为每个类型重复代码。

更新:我觉得这不是重复的,因为我引用了 Enum 的整数,而其他引用的重复项没有尝试解析 Enum完全没有。

【问题讨论】:

可能重复:***.com/questions/29482/how-to-cast-int-to-enum 您需要将 T 限制为枚举 ***.com/questions/79126/… @JoelWiklund OP 显然在第一行就做到了 试试return (T)Enum.ToObject(typeof(T), returnInt); 这能回答你的问题吗? Cast Int to Generic Enum in C# 【参考方案1】:

更改为return (TEnum)Enum.ToObject(typeof(TEnum), returnInt);。更多信息here。

public class Program

    public static void Main()
    
        var favoriteColor = AskGenericType<Color>("What is your favorite color?");
        Console.WriteLine(favoriteColor);

        var favoriteCar = AskGenericType<Car>("What is your favorite car?");
        Console.WriteLine(favoriteCar);
    

    enum Color
    
        Red,
        Blue,
        Yellow
    

    enum Car
    
        Volvo,
        Lamborghini,
        Ferrari
    

    public static TEnum AskGenericType<TEnum>(string message) where TEnum : struct, Enum
    
        //Display options
        Console.WriteLine(message);
        foreach (var item in Enum.GetValues(typeof(TEnum)))
        
            Console.WriteLine($"[(int)item] item");
        

        var returnInt = TryParseInput();

        while (true)
        
            if (Enum.IsDefined(typeof(TEnum), returnInt))
                break;
            //Cannot parse input as one of the choices presented from the Enum
            Console.WriteLine($"Please choose from one of the options.");
            returnInt = TryParseInput();
        

        return (TEnum)Enum.ToObject(typeof(TEnum), returnInt);
    

    private static int TryParseInput()
    
        int returnInt;
        while (!int.TryParse(Console.ReadLine(), out returnInt))
        
            //Cannot parse input as an integer
            Console.WriteLine($"Selection is not a number. Please try again.");
        

        return returnInt;
    

输出

What is your favorite color?
[0] Red
[1] Blue
[2] Yellow
1
Blue
What is your favorite car?
[0] Volvo
[1] Lamborghini
[2] Ferrari
0
Volvo

【讨论】:

以上是关于试图概括 c# 函数但得到“无法将'int'转换为'T'”的主要内容,如果未能解决你的问题,请参考以下文章

将 Json 反序列化为实体框架无法将 int 转换为类型

在数据库项目中将 Int 更改为 uniqueidentifier

似乎无法将 int 转换为 linq 表达式中的字符串 [重复]

将Json反序列化为Entity Framework无法将int转换为type

试图移动一个 div 但得到“outerhtml 不是一个函数”

从未见过 C++ for 循环