我想定义一个通用接口,它允许可以为空的值类型(int?,double?等)和类类型(也可以为null)。我不想允许简单的值类型。有没有办法做到这一点?
答案 0 :(得分:6)
编辑:鉴于问题标题,我假设您要将类型参数约束为而不是是不可为空的值类型。在问题 body 中指定它可能是个好主意。
不 - 没有这样的限制。实际上,class
和struct
约束都禁止可以为可为空的值类型的参数。
您可以创建一个没有约束的接口,但只创建两个实现:
interface IFoo<T> { }
class FooClass<T> : IFoo<T> where T : class {}
class FooNullableValue<T> : IFoo<Nullable<T>> where T : struct {}
当然,这不会阻止其他任何人实施IFoo<int>
。如果您能给我们更多背景知识,我们可以提供更多帮助。
答案 1 :(得分:0)
This可能就是你要找的东西。
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
答案 2 :(得分:0)
是的,只需使用无约束就可以指定任何类型:
public interface IAllowReferenceTypes<T>
{
T GetValue();
}
public class SomeClass : IAllowReferenceTypes<Int32?>
{
public Int32? GetValue() { return null; }
}
编辑:已修复。
注意:您要求在标题中使用约束,但如果您的问题只是要求允许可以为空的值类型和引用类型的接口,则在正文中。
使用无约束完成后者。正如Jon的回答指出的那样,没有办法使用约束保证类型可以为空。但是,您可以不使用约束并检查null(或default(T))