C# 用通用T检验布尔值
我有一个通用方法,我想传入一个引用类型或boolC# 用通用T检验布尔值,c#,generics,C#,Generics,我有一个通用方法,我想传入一个引用类型或bool private void Test<T>(T value) { if(typeof(T)) == typeof(bool)) { if(value == false) // do something else if (value == null) // do something else } } 即使已验证类型,您仍然需要强制转换
private void Test<T>(T value)
{
if(typeof(T)) == typeof(bool))
{
if(value == false)
// do something
else if (value == null)
// do something else
}
}
即使已验证类型,您仍然需要强制转换,并且您的
else
语句将永远不会激发:
private void Test<T>(T value)
{
if(typeof(T)) == typeof(bool))
{
if((bool)value == false)
// do something
else if (value == null) // this will never be true for a bool!
// do something else
}
}
private void Test(T值)
{
if(typeof(T))==typeof(bool))
{
如果((bool)值==false)
//做点什么
else if(value==null)//对于bool,这永远不会是真的!
//做点别的
}
}
即使验证了类型,您仍然需要强制转换,并且您的else
语句将永远不会触发:
private void Test<T>(T value)
{
if(typeof(T)) == typeof(bool))
{
if((bool)value == false)
// do something
else if (value == null) // this will never be true for a bool!
// do something else
}
}
private void Test(T值)
{
if(typeof(T))==typeof(bool))
{
如果((bool)值==false)
//做点什么
else if(value==null)//对于bool,这永远不会是真的!
//做点别的
}
}
您需要一个丑陋的双重演员阵容,如下所示:
private void Test<T>(T value)
{
if(typeof(T) == typeof(bool))
{
if((bool)(object)value)
// do something
else if (!(bool)(object)value)
// do something else
}
}
然而,应该注意的是,在泛型方法中测试类型,并对不同的类型参数使用不同的策略,这是非常糟糕的代码味道。您最好为
bool
或任何其他需要提供特殊处理的参数类型提供不同的重载。您需要一个丑陋的双重强制转换,如下所示:
private void Test<T>(T value)
{
if(typeof(T) == typeof(bool))
{
if((bool)(object)value)
// do something
else if (!(bool)(object)value)
// do something else
}
}
然而,应该注意的是,在泛型方法中测试类型,并对不同的类型参数使用不同的策略,这是非常糟糕的代码味道。您最好为
bool
或需要提供特殊处理的任何其他参数类型提供不同的重载。使用is
操作符:
private void Test<T>(T value)
{
if(value is bool)
{
...
}
}
private void Test<T>(T value)
{
bool? boolValue = value as bool;
if (boolValue != null) {
// do something with boolValue, which can never be null if value is of type bool
}
else {
// do something with value, which is not a boolean
}
}
使用
is
运算符:
private void Test<T>(T value)
{
if(value is bool)
{
...
}
}
private void Test<T>(T value)
{
bool? boolValue = value as bool;
if (boolValue != null) {
// do something with boolValue, which can never be null if value is of type bool
}
else {
// do something with value, which is not a boolean
}
}
根据调用此方法的方式,您可以使用
bool
创建重载:
private void Test(bool b)
{
if(! b)
{
//do something
}
}
private void Test<T>(T value) where T : class
{
if(value == null)
{
//do something else
}
}
专用无效测试(bool b)
{
如果(!b)
{
//做点什么
}
}
专用无效测试(T值),其中T:等级
{
如果(值==null)
{
//做点别的
}
}
根据调用此方法的方式,您可以使用bool创建重载:
private void Test(bool b)
{
if(! b)
{
//do something
}
}
private void Test<T>(T value) where T : class
{
if(value == null)
{
//do something else
}
}
专用无效测试(bool b)
{
如果(!b)
{
//做点什么
}
}
专用无效测试(T值),其中T:等级
{
如果(值==null)
{
//做点别的
}
}
T是一个类型参数,可以是类或结构,因此编译器不允许您执行类和结构中不存在的操作。(旁注:value==false
->!value
)我更倾向于问您为什么需要这样做?这里有些错误。T是一个类型参数,可以是类或结构,因此编译器不允许您执行类和结构中不存在的操作。(旁注:value==false
->!value
)我更倾向于问您为什么需要这样做?这里有点不对劲。说得好,但并不能解决OP所指的问题。感谢您指出这一点,已更新为包含as
运算符变体,它将解决使用该值进行操作的问题。@mayabelle as运算符必须与引用类型或可为null的类型一起使用('bool'是一种不可为null的值类型)谢谢,尽管我收到了一个错误“运算符不能与不可为null的值类型一起使用”
bool“使用as.Sorry,我有一个输入错误,没有找到问号,它应该是bool?
,可以为空。这一点很好,但并不能解决OP所指的问题。感谢您指出这一点,更新为包含as
操作符变体,它将解决使用该值执行操作的问题。@mayabelle as操作符m必须与引用类型或可空类型一起使用(“bool”是不可空的值类型)谢谢,尽管我收到了一个错误“运算符不能与不可空的值类型一起使用”bool“使用as.Sorry,我有一个输入错误,没有找到问号,它应该是bool?
,可以为空。谢谢,但是我在强制转换时遇到以下错误:“无法将typeT'转换为bool'”@user2994682我们使用的是我的代码的最新版本吗(使用双强制转换--(bool)(object)值
)?您不应该看到该错误。谢谢,但我在强制转换时遇到以下错误:“无法将类型t'转换为bool'”@user2994682我们是否使用我的代码的最新版本(使用双强制转换--(bool)(object)值
)?您不应该看到该错误。