我希望能够区分以下情况:
然而,如果我尝试像这样检测第三种情况,它将无法编译:
错误信息为:类型 'X' 已定义具有相同参数类型的成员 'Foo'。但是,我无法区分
如果我删除第三个函数(3),下面的代码也无法编译:
- 纯值类型(例如
int
) - 可空值类型(例如
int?
) - 引用类型(例如
string
) - 可选的,如果将其映射到上面的(1)或(2)中,我不会在意
static void Foo<T>(T a) where T : struct { } // 1
static void Foo<T>(T? a) where T : struct { } // 2
然而,如果我尝试像这样检测第三种情况,它将无法编译:
static void Foo<T>(T a) where T : class { } // 3
错误信息为:类型 'X' 已定义具有相同参数类型的成员 'Foo'。但是,我无法区分
where T : struct
和 where T : class
。如果我删除第三个函数(3),下面的代码也无法编译:
int x = 1;
int? y = 2;
string z = "a";
Foo (x); // OK, calls (1)
Foo (y); // OK, calls (2)
Foo (z); // error: the type 'string' must be a non-nullable value type ...
我该如何使得Foo(z)
编译通过,并将其映射到上述函数之一(或者第三个函数,具有其他约束条件,我还没有考虑)?