【发布时间】:2017-11-21 22:33:04
【问题描述】:
我想编写一个接受单个IBar 的方法并调用它的Baz 方法。
当obj 为空时抛出:
void Foo<T>(T obj)
where T : IBar
=> obj.Baz();
当它是值类型时,此框 obj:
void Foo<T>(T obj)
where T : IBar
=> obj?.Baz();
如果obj 为零,则不会调用Baz:
void Foo<T>(T obj)
where T : IBar
{
if (!EqualityComparer<T>.Default.Equals(obj, default(T)))
obj.Baz();
}
在这里,Foo(new Bar()) 总是选择泛型方法,无论 Bar 是类还是结构:
void Foo<T>(T obj)
where T : struct, IBar
=> obj.Baz();
void Foo(IBar obj)
=> obj?.Baz();
这让我的眼睛流血:
void FooVal<T>(T obj)
where T : struct, IBar
=> obj.Baz();
void FooRef(IBar obj)
=> obj?.Baz();
那么有没有最佳实践呢?我愿意接受所有建议。
编辑:
问题用Generic constraints, where T : struct and where T : class 和旧标题标记为重复。所以我更新了标题以更好地表达我的问题。我要问的是,我怎样才能调用泛型方法并使用参数只有在它不为空时才使用,而不是装箱。
针对链接问题解释的一些解决方法可用于来回答这个问题,但我仍然认为这是一个根本不同的问题。
【问题讨论】:
-
只有引用类型(类)可以为空。值类型(结构)永远不能为空(并且为
Nullable<T>使用空只是语法糖)。另一方面,为了调用实例方法,可以对结构进行装箱;请参阅stackoverflow.com/questions/5494807 进行讨论。
标签: c# generics interface overloading boxing