【发布时间】:2011-02-27 19:20:55
【问题描述】:
我想区分以下情况:
- 普通值类型(例如
int) - 可以为空的值类型(例如
int?) - 引用类型(例如
string) - 可选,我不关心它是否映射到上面的 (1) 或 (2)
我想出了以下代码,适用于情况(1)和(2):
static void Foo<T>(T a) where T : struct { } // 1
static void Foo<T>(T? a) where T : struct { } // 2
但是,如果我尝试像这样检测案例 (3),它不会编译:
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) 进行编译,将其映射到上述函数之一(或第三个具有另一个约束的函数,我没有想到)?
【问题讨论】:
-
对于引用类型有:new(),但是对于可为空的值类型,这有奇怪的行为。
标签: c# generics class struct constraints