# 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
