我已经为 funion 发送了 2 个通用参数,第一个是 char,第二个是 int 为什么第一个 if cond 有效?

i have send 2 generic args for funion first one is char and second is int why the first if cond is work?

我已经向 func 发送了两个通用参数,并简单地询问它们是否是 typeof int,我将其中一个作为 char 发送,第二个作为 int 发送,但 if cindison 仍然有效 exsample : 结果是首先,如果 cond 有效,我真的不明白为什么,因为第一个 arg 是 char

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp5
{
    class Program
    {

        public static T Adds<T>(T number1 , T number2 )
        {
            if ((number1 is int) && (number2 is int))
            {
                Console.WriteLine("int test");
            }
            else if (number1 is double )
            {
                Console.WriteLine("double test");
            }
            return number1;
        }

        public static void Main(string[] args)
        {

            Console.WriteLine(Adds('c',2));
        }
    }
}

这就是你想要做的:

class Program
{
    public static T Adds<T>(object number1, object number2)
    {
        if ((number1 is int) && (number2 is int))
        {
            Console.WriteLine("int test");
        }
        else if (number1 is double)
        {
            Console.WriteLine("double test");
        }
        return (T)Convert.ChangeType(number1, typeof(T));
    }

    public static void Main(string[] args)
    {

        Console.WriteLine(Adds<int>('c', 2));
    }
}

您已使用单一泛型类型声明了该方法。如果您希望参数具有不同的类型,则必须声明

public static T Adds<T,T2>(T number1 , T2 number2 )

您还没有告诉编译器要为 T 使用哪种类型。 Number1 和 Number2 必须具有相同的类型。 由于 char 可隐式转换为 int,因此使用 int 类型。

如果调试代码,您会看到 number1 的类型为 int,值为 99。

如果你想打电话给:

Console.WriteLine(Adds<char>('c',2));

会出现编译错误。

这是因为编译器将其隐式转换为 int 以作为两个参数 int

如果您尝试像下面这样显式指定 T 类型,您将遇到编译错误

 Console.WriteLine(Adds<char>('c',2));

因为两个参数都不能隐式转换为 char 为了克服这个问题,你需要将第二个参数转换为 char

Console.WriteLine(Adds<char>('c',(char)2));

这是[隐式数字转换 Table(C# 参考)][1]

的参考

[1]: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/implicit-numeric-conversions-table 也有帮助

当前签名

 T Adds<T>(T number1, T number2)

确保两个参数number1number2必须属于相同的类型。这就是为什么

 Add('c', 2)
 Add(1, 3.14)

将被执行为

 Add<int>((int)'c', 2);
 Add<double>((double)1, 3.14);

因为 char 可以 隐式转换 int 并且(第二个示例) int 可以 隐式转换 变成 double。如果你想用自己的类型来处理每个参数,请尝试

// T1 Adds<T1, T2>: if Adds return 1st parameter
// T2 Adds<T1, T2>: if Adds return 2nd parameter 
T1 Adds<T1, T2>(T1 number1, T2 number2) {
  ...
}

在这种情况下

Add('c', 2)

将被称为

// No conversion: T1 is char, T2 is int
Add<char, int>('c', 2)