gpt4 book ai didi

c# - 将泛型限制为可以为空的事物

转载 作者:IT王子 更新时间:2023-10-29 04:27:53 24 4
gpt4 key购买 nike

我想将我正在编码的泛型限制为任何可以为 null 的东西。这基本上是任何类 + System.Nullable(例如 int? 等)。

对于类部分,这很容易:

public class MyGeneric<T> where T : class {}

但是,这不允许我这样做:

var myGeneric = new MyGeneric<int?>();

或者这个:

var myGeneric = new MyGeneric<Nullable<int>>();

编译器提示:
错误 CS0452:“int”类型?必须是引用类型才能将其用作泛型类型或方法“Test.MyGeneric”中的参数“T”

所以我尝试添加 System.Nullable 作为 T 的可接受类型:

public class MyGeneric<T> where T : class, System.Nullable {}

但是不行。编译器返回以下错误:
错误 CS0717:“System.Nullable”:静态类不能用作约束

然后我尝试了

public class MyGeneric<T> where T : class, INullable {}

它确实可以编译,但是当我编译时:

var myGeneric = new MyGeneric<string>();

编译器返回此错误:
错误 CS0311:类型“字符串”不能用作泛型类型或方法“Test.MyGeneric”中的类型参数“T”。没有从“字符串”到“System.Data.SqlTypes.INullable”的隐式引用转换。

因此,问题是:是否有可能将泛型限制为任何可以为 null 的东西,那么,怎么做呢?

作为引用,我使用的是 VS2010/C# 4.0

编辑
有人问我想用它做什么。这是一个例子:

namespace Test
{
public class MyGeneric<T> where T : class
{
private IEnumerable<T> Vals { get; set; }

public MyGeneric(params T[] vals)
{
Vals = (IEnumerable<T>)vals;
}

public void Print()
{
foreach (var v in Vals.Where(v => v != default(T)))
{
Trace.Write(v.ToString());
}
Trace.WriteLine(string.Empty);
}
}

class Program
{
static void Main(string[] args)
{
MyGeneric<string> foo =
new MyGeneric<string>("a", "b", "c", null, null, "g");
foo.Print();
}
}
}

此程序在调试控制台中打印 abcg

最佳答案

不,没有办法在编译时执行此操作。

就个人而言,我只是让 T 成为任何东西,然后我会在静态构造函数中检查它的有效性:

public class MyGeneric<T>
{
static MyGeneric()
{
var def = default(T);
if (def is ValueType && Nullable.GetUnderlyingType(typeof(T)) == null)
{
throw new InvalidOperationException(
string.Format("Cannot instantiate with non-nullable type: {0}",
typeof(T)));
}
}
}

关于c# - 将泛型限制为可以为空的事物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5737959/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com