13

我想创建一个同时接受值类型引用类型参数的简单方法,即 int 是值,字符串是引用。

所以这就是我的开始:

public bool AreBothNotNull<T>(T? p1, T? p2)
{
    return (p1.HasValue && p2.HasValue);
}

所以我希望能够像这样使用它:

var r1 = AreBothNotNull<int>(3, 4); // will be true
var r2 = AreBothNotNull<int>(3, null); // will be false
var r3 = AreBothNotNull<string>("three", "four"); // will be true
var r4 = AreBothNotNull<string>(null, "four"); // will be false

但我遇到的第一个问题是

类型“T”必须是不可为空的值类型,才能将其用作泛型类型或方法“System.Nullable”中的参数“T”

为了继续,我在我的方法中添加了一个结构约束

public bool AreBothNotNull<T>(T? p1, T? p2) where T : struct

但现在该方法将不接受基于字符串的调用,并给我这个错误:

类型“字符串”必须是不可为空的值类型,才能将其用作泛型类型或方法中的参数“T”。

这可能吗?或者为什么我们被阻止这样做?

4

1 回答 1

26

您的问题是您想要相互冲突的泛型类型约束:

  • Nullable<T>仅适用于值类型
  • 引用类型不是值类型

所以你需要有两个重载才能让你的代码工作:

public static bool AreBothNotNull<T>(T? p1, T? p2) where T : struct
{            
    return (p1.HasValue && p2.HasValue);
}

public static bool AreBothNotNull<T>(T p1, T p2)
{
    return (p1 != null && p2 != null);
}

尽管如此,以下行将永远不会编译:

var r3 = AreBothNotNull<string>(3, 4);

这里有一个冲突,泛型类型参数声明参数是 type string,但代码尝试传递ints 。

于 2010-10-23T08:09:37.790 回答