127 lines
2.6 KiB
Markdown
127 lines
2.6 KiB
Markdown
# C# 5.0 Syntax — Required for NT8 SDK
|
|
|
|
This project targets **.NET Framework 4.8** and must use **C# 5.0 syntax only**.
|
|
NinjaTrader 8's NinjaScript compiler does not support C# 6+ features.
|
|
|
|
---
|
|
|
|
## Forbidden Patterns (with fixes)
|
|
|
|
### String Interpolation (C# 6)
|
|
```csharp
|
|
// ❌ NEVER
|
|
_logger.LogInformation($"Order {orderId} filled at {price}");
|
|
|
|
// ✅ ALWAYS
|
|
_logger.LogInformation("Order {0} filled at {1}", orderId, price);
|
|
```
|
|
|
|
### Null-Conditional Operator (C# 6)
|
|
```csharp
|
|
// ❌ NEVER
|
|
var name = order?.Symbol;
|
|
|
|
// ✅ ALWAYS
|
|
var name = order != null ? order.Symbol : null;
|
|
```
|
|
|
|
### Null-Coalescing Assignment (C# 8)
|
|
```csharp
|
|
// ❌ NEVER
|
|
value ??= defaultValue;
|
|
|
|
// ✅ ALWAYS
|
|
if (value == null) value = defaultValue;
|
|
```
|
|
|
|
### Expression-Bodied Members (C# 6)
|
|
```csharp
|
|
// ❌ NEVER
|
|
public int Contracts => _contracts;
|
|
public void Reset() => _contracts = 0;
|
|
|
|
// ✅ ALWAYS
|
|
public int Contracts { get { return _contracts; } }
|
|
public void Reset() { _contracts = 0; }
|
|
```
|
|
|
|
### nameof Operator (C# 6)
|
|
```csharp
|
|
// ❌ NEVER
|
|
throw new ArgumentNullException(nameof(intent));
|
|
|
|
// ✅ ALWAYS
|
|
throw new ArgumentNullException("intent");
|
|
```
|
|
|
|
### Auto-Property Initializers (C# 6)
|
|
```csharp
|
|
// ❌ NEVER
|
|
public bool IsEnabled { get; set; } = true;
|
|
|
|
// ✅ ALWAYS — initialize in constructor
|
|
public bool IsEnabled { get; set; }
|
|
public MyClass() { IsEnabled = true; }
|
|
```
|
|
|
|
### Inline Out Variable Declaration (C# 7)
|
|
```csharp
|
|
// ❌ NEVER
|
|
if (_orders.TryGetValue(id, out var status)) { ... }
|
|
|
|
// ✅ ALWAYS
|
|
OrderStatus status;
|
|
if (_orders.TryGetValue(id, out status)) { ... }
|
|
```
|
|
|
|
### Pattern Matching (C# 7)
|
|
```csharp
|
|
// ❌ NEVER
|
|
if (obj is string s) { ... }
|
|
|
|
// ✅ ALWAYS
|
|
if (obj is string) { var s = (string)obj; ... }
|
|
```
|
|
|
|
### Local Functions (C# 7)
|
|
```csharp
|
|
// ❌ NEVER — function inside a method
|
|
public void Execute() {
|
|
void Helper() { ... }
|
|
Helper();
|
|
}
|
|
|
|
// ✅ ALWAYS — use private methods
|
|
private void Helper() { ... }
|
|
public void Execute() { Helper(); }
|
|
```
|
|
|
|
### Tuple Literals (C# 7)
|
|
```csharp
|
|
// ❌ NEVER
|
|
var result = (price: 100.0, qty: 5);
|
|
|
|
// ✅ ALWAYS — use Tuple<T1,T2> or a named class
|
|
var result = Tuple.Create(100.0, 5);
|
|
```
|
|
|
|
### using static (C# 6)
|
|
```csharp
|
|
// ❌ NEVER
|
|
using static System.Math;
|
|
|
|
// ✅ ALWAYS
|
|
System.Math.Floor(x);
|
|
Math.Floor(x); // (via standard using System;)
|
|
```
|
|
|
|
---
|
|
|
|
## Quick Self-Check Before Saving
|
|
|
|
- Search your code for `$"` — if found, replace every occurrence
|
|
- Search for `?.` — if found, replace with null check
|
|
- Search for `=>` — if on a property or method, rewrite as full block
|
|
- Search for `nameof` — replace with string literal
|
|
- Search for `out var` — split into declaration + assignment
|