2015-02-10 54 views
0

我受到了我希望是一個簡單問題的困擾。我試圖嵌入一個簡單的公式來遞增一個變量,以充當XML文檔的「行號」。在Visual Basic中編寫文字XML。下面的代碼是什麼樣子:Visual Basic XML Literals嵌入式表達式 - 我可以做簡單的數學嗎?

<%= From d In orderData 
             Select <ItemOut quantity=<%= d.OrderQuantity %> lineNumber=<%= i %>> 
                <ItemID> 
                 <SupplierPartID><%= d.VendorPartNo %></SupplierPartID> 
                </ItemID> 
                <ItemDetail> 
                 <UnitPrice> 
                  <Money currency="USD"><%= d.PricePerPackage %></Money> 
                 </UnitPrice> 
                 <Description xml:lang="en"><%= d.Description %></Description> 
                 <UnitOfMeasure><%= d.OrderUOM %></UnitOfMeasure> 
                </ItemDetail> 
                <%= i = i + 1 %> 
               </ItemOut> 
             %> 

我期待d的每一次迭代中OrderData打勾+ 1,但是,它簡單地返回「假」。看到輸出XML在這裏:

<ItemOut quantity="1" lineNumber="1"> 
     <ItemID> 
      <SupplierPartID>99999</SupplierPartID> 
     </ItemID> 
     <ItemDetail> 
      <UnitPrice> 
      <Money currency="USD">0.00</Money> 
      </UnitPrice> 
      <Description xml:lang="en">Tub and Tile Caulk Biscuit</Description> 
      <UnitOfMeasure>cs</UnitOfMeasure> 
     </ItemDetail>false</ItemOut> 
     <ItemOut quantity="1" lineNumber="1"> 
     <ItemID> 
      <SupplierPartID>999999</SupplierPartID> 
     </ItemID> 
     <ItemDetail> 
      <UnitPrice> 
      <Money currency="USD">0.00</Money> 
      </UnitPrice> 
      <Description xml:lang="en">Tub and Tile Caulk Almond</Description> 
      <UnitOfMeasure>cs</UnitOfMeasure> 
     </ItemDetail>false</ItemOut> 

是否有可能做這種事情?我甚至嘗試打電話給一個功能,而不是:

lineNumber=<%= incrementI(i) %>> 

但是,這也導致「錯誤」作爲輸出。我在這裏錯過了什麼? 非常感謝您的幫助!

的Visual Studio 2013

Edit-- 這裏我指的功能:

Private Function incrementI(i As Integer) 
    Return i = i + 1 
End Function 
+0

這就是我期望的內聯版本;請記住,VB對* assignment *和* comparison *使用'=',並且使用哪個取決於它是*語句*還是*表達式*的上下文 - 並且由於它試圖形成一個表達式,所以它會比較'我'與'我+ 1'並得出結論,他們不相等。不能說沒有看到你如何定義函數的函數。 – 2015-02-10 13:20:03

+0

私有函數incrementI(i As Integer) 返回i = i + 1 結束函數 – Stefan 2015-02-10 13:54:28

+0

是的,您再次在需要* expression *的上下文中使用它,因此它將執行比較。如果你已經定義了函數的返回類型,那麼編譯器會幫助解決這個問題。而且,因爲該參數不是通過引用傳遞的,所以它也不會有任何副作用(所以外部代碼中的「i」保留函數調用之前的任何值)。 – 2015-02-10 13:57:44

回答

0

如果定義IncrementI通過引用而不是通過值來接受它的參數,你可以這樣寫:

Sub Main() 
    Dim j As Integer = 0 

    Dim x = <sample><thing><%= IncrementI(j) %></thing><thing><%= IncrementI(j) %></thing></sample> 

    Console.WriteLine(x) 
    Console.ReadLine() 
End Sub 

Function IncrementI(ByRef i As Integer) As Integer 
    i = i + 1 'This is now a statement rather than an expression, so its assignment 
    Return i 
End Function 

將會產生這個XML:

<sample> 
    <thing>1</thing> 
    <thing>2</thing> 
</sample> 

正如在註釋中指出的,Visual Basic使用=來分配和相等。如果您在需要表達式的上下文中使用它,您將得到一個相等比較,返回TrueFalse

如果打開Option Strict和定義函數的返回類型,那麼編譯器會幫助你看到你的功能並沒有固定的事項:

'Broken code 
Private Function incrementI(i As Integer) as Integer 
    Return i = i + 1 
End Function 

當Option Strict爲上,上述生產錯誤

Option Strict On不允許從'布爾'到'整數'的隱式轉換。

+0

謝謝。作爲一個業餘愛好者程序員,有些東西比如我認爲理所當然的「ByRef」不知道目的是什麼。我現在知道了。 – Stefan 2015-02-10 14:08:27

相關問題