我正在创建SelectList各种联系人.我想证明是一个组合的文本FirstName,MiddleInit(如果可能的话),和LastName.
IEnumerable<SelectListItem> items = contacts
.Select(r => new SelectListItem()
{
Value = r.ContactID.ToString(),
Text = r.FirstName + " "
+ string.IsNullOrEmpty(r.MiddleInit) ? r.MiddleInit + ". " : ""
+ r.LastName
});
Run Code Online (Sandbox Code Playgroud)
我收到错误:
Error 4 Cannot implicitly convert type 'string' to 'bool' C:\Users\cu551d\Documents\Visual Studio 2010\Projects\WVM\WVM\Controllers\SOWController.cs 181 15 WVM
Run Code Online (Sandbox Code Playgroud)
我猜这与我的语法有关.我能在c#中做这样的事吗?
另外,我应该在Trim()声明中加入声明MiddleInit吗?我认为这个错误非常奇怪IsNullOrEmpty,事实上回复一个bool.我也试过了(string.IsNullOrEmpty(r.MiddleInit) == true ) ..
aka*_*tos 20
尝试在括号中分组.它看起来像你正在向后执行条件运算符:
IEnumerable<SelectListItem> items = contacts
.Select(r => new SelectListItem()
{
Value = r.ContactID.ToString(),
Text = r.FirstName + " " +
(string.IsNullOrEmpty(r.MiddleInit) ? "" : (r.MiddleInit + ". ")) +
r.LastName
});
Run Code Online (Sandbox Code Playgroud)
既然你要将它转换成空字符串,你也可以考虑这个:
Text = r.FirstName + " " + (r.MiddleInit ?? "") + r.LastName
Run Code Online (Sandbox Code Playgroud)
在??被称为Null Coalescing Operator.如果该值不为null,它将返回左侧的任何内容,否则右侧的内容将返回.
http://msdn.microsoft.com/en-us/library/ms173224.aspx
编辑:虽然更清洁,但这对你的情况不太适用,因为你需要在初始之后的时期.但请注意它确实存在!
问题是由于运算符优先级导致编译器以您不期望的方式解析表达式.只需将三元表达式包含在parens中,就会礼貌地向编译器解释你的意思.
作为旁注,看一下表达式的逻辑,我认为结果术语的顺序是不正确的.我在下面的代码中切换了它们.
IEnumerable<SelectListItem> items = contacts
.Select(r => new SelectListItem()
{
Value = r.ContactID.ToString(),
Text = r.FirstName + " "
+ (string.IsNullOrEmpty(r.MiddleInit) ? "" : r.MiddleInit + ". ")
+ r.LastName
});
Run Code Online (Sandbox Code Playgroud)
更多解释
没有(,+优先级高于?:,所以你的问题中的表达式被解析,好像它说:
Test = (r.FirstName + " " + string.IsNullOrEmpty(r.MiddleInit)) ? (r.MiddleInit + ". ") : ("" + r.LastName)
Run Code Online (Sandbox Code Playgroud)
因此,您的错误的来源是?:运算符的条件部分实际上是一个字符串 - 它将包含类似"Andrew true"的内容.另请注意,r.LastName与?:操作符的第三项结合使用.
Trim()问题
如果有r.MiddleInit可能包含空格,那么使用Trim()会有所帮助,但最好将测试更改为String.IsNullOrWhiteSpace(r.MiddleInit).