【发布时间】:2020-12-05 00:15:04
【问题描述】:
我有这个方法:
public static DiffModule<T> AddValue<T>(T Source, T Destination)
{
DiffModule<T> module = new DiffModule<T>();
module.Source = Source;
module.Desctination = Destination;
var type = typeof(T);
//Check nullable
if(Source==null && Destination == null)
{
module.Result = CompareResult.Equal;
return module;
}
if (Source == null)
{
module.Result = CompareResult.NotExistInSource;
return module;
}
if (Destination == null)
{
module.Result = CompareResult.NotExistInDestination;
return module;
}
module.Result = (EqualityComparer<T>.Default.Equals(Source, Destination)) ? CompareResult.Equal : CompareResult.NotEqual;
return module;
}
public enum CompareResult
{
Undefined,
Equal,
NotEqual,
NotExistInSource,
NotExistInDestination
}
如果我愿意
var m1 = DiffModule<string>("Hi there",null);
这将返回 NotExistInDestination 枚举结果,但如果我愿意尝试
var m2 = DiffModule<int>(2,null) <-- that of course is an error
如何“使” int、double、decimal、datetime 类型作为可空传递给 AddValue 方法? 请考虑数据可以从固定值类型的 VO 传递
例如:public DateTime EndDate {get; set;} 不能是 public DateTime? {get;set;}
【问题讨论】:
-
虽然我不确定我是否完全理解了这个问题...
AddValue<int?>(2, null);或AddValue(2, (int?)null);? -
试过 DiffModule
.AddValue(4, null) null throw error can't convert to double - 也试过 (double?)null - 没用 -
作为问题的切线解决方案,您可以将泛型参数设为可空 (example fiddle),前提是您知道该类型不可为空。
-
您的代码中的部分问题是您的相等比较逻辑存在于包含存储的通用值的类的外部(即
DiffModule<T>)。如果此逻辑封装在DiffModule<T>中,您将能够考虑所有可为空与不可为空的情况,同时还为外部消费者提供可重用的接口。 -
"那当然是一个错误" 你从来没有展示过
DiffModule<>的类定义,也没有你得到的实际错误,所以无法判断。我们可以猜测你的构造函数定义可能是什么,但最好是查看实际代码而不是猜测它可能是什么。
标签: c#