是否有一种方法可以定义一个泛型接口,该接口具有类型可以为空(但不能为值类型)的约束
本文关键字:类型 约束 接口 但不能 一个 方法 一种 定义 泛型接口 是否 | 更新日期: 2023-09-27 18:10:42
我想定义一个通用接口,允许可空值类型(int?、双吗?等)和类类型(也可以为null)。我不想允许使用简单的值类型。有办法做到这一点吗?
编辑:给定问题标题,我假设您希望将类型参数约束为,而不是为非空值类型。在问题正文中指定 too可能是个好主意。
没有——没有这样的约束。事实上,class
和struct
约束都禁止可空值类型的参数。
您可以在没有约束的情况下创建接口,但只创建两个实现:
interface IFoo<T> { }
class FooClass<T> : IFoo<T> where T : class {}
class FooNullableValue<T> : IFoo<Nullable<T>> where T : struct {}
这当然不会阻止其他人实现IFoo<int>
。如果你能给我们更多的背景资料,我们也许能帮上更多的忙。
可以,只要不使用约束就可以指定任何类型:
public interface IAllowReferenceTypes<T>
{
T GetValue();
}
public class SomeClass : IAllowReferenceTypes<Int32?>
{
public Int32? GetValue() { return null; }
}
编辑:。
注意:你在标题中要求约束,但在正文中,如果你的问题只要求一个允许空值类型和引用类型的接口。
不使用约束可以实现后者。正如Jon的回答所指出的,没有办法使用约束来保证类型是可空的。但是,您可以不使用约束并检查null(或default(T))
这可能就是你要找的。
Greg Dean的回答:
将返回类型更改为Nullable,并调用带有非空参数的方法
static void Main(string[] args)
{
int? i = GetValueOrNull<int>(null, string.Empty);
}
public static Nullable<T> GetValueOrNull<T>(DbDataRecord reader, string columnName) where T : struct
{
object columnValue = reader[columnName];
if (!(columnValue is DBNull))
return (T)columnValue;
return null;
}
另外,请参阅以下MSDN关于通用接口的文章:http://msdn.microsoft.com/en-us/library/kwtft8ak.aspx